正则表达式 - 排除组中的字符集



尝试编写一个可以在给定语法的情况下拆分标题和作者的正则表达式:

作者姓名 - 标题

标题可以包含多个"-"。

我有以下正则表达式:([^-]*) - (.*)

这适用于大多数情况,例如

Douglas Adams - Life, The Universe & Everything

分为Douglas AdamsLife, The Universe & Everything

但双管作者姓名失败 -例如 Ayize Jama-Everett - Some Book Title,然后我得到:

作者 = Everett

所以我想更改排除组[^-]以排除组" - ",因为名称中的连字符周围没有空格。

我该怎么做?

看起来你需要惰性量词:

(.*?) - (.*)

第一组将在-之前获得最小数量的符号。第二个将捕获其余部分。如果字符串中没有-,则不匹配。

取决于您如何使用它。您还可以通过添加开始和结束量词来强制它与整个字符串匹配:

^(.*?) - (.*)$

如果您知道" - "是作者姓名和书名之间的分隔符,只需在该分隔符上进行简单的字符串拆分即可。正则表达式似乎矫枉过正。

在 Python 中:

>>> "Author Name-Hyphen - Book Title".split(" - ")
['Author Name-Hyphen', 'Book Title']

"字符"类除了空格连字符空格之外的所有内容看起来都像 tbis——这是不这样做的一个很好的理由(Perl 中的示例):

say "author=($1) title=($2)"
    if q{foo bar-baz - taz-fraz daz} =~ m/((?: [^-]|(?:[^ ]-[^ ]))+ ) s - s (.+)/x
#                                          ^^^^^^^^^^^^^^^^^^^^^^^^
#                                          this mess here

它使用重复一次或多次的交替[^-][^ ]-[^ ](非空格、连字符、非空格)。字符类必须是一个字符,但替代字符则不然。

相反,你应该使用"split"(或任何你的语言中的等效词)

my ($author, $title) = split(/ - /, $record, 2);

它将所有内容都带到-并将其放在$author中,然后其余的放在标题中。

最新更新