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

时间:2012-08-09 20:42:32

标签: regex

尝试编写一个可以根据语法分割标题和作者的正则表达式:

作者姓名 - 标题

标题可以包含多个“ - ”。

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

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

Douglas Adams - Life, The Universe & Everything

分为Douglas AdamsLife, The Universe & Everything

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

作者= Everett

因此,我想更改排除组[^-]以排除组" - ",因为名称中的连字符不会包含空格。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

看起来你需要lazy quantifier

(.*?) - (.*)

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

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

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

答案 1 :(得分:1)

如果您知道“ - ”是作者姓名和书名之间的分隔符,则只需在该分隔符上分割一个简单的字符串。正则表达式似乎有点矫枉过正。

在Python中:

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

答案 2 :(得分:-1)

“character”类除了space-hyphen-space 之外的所有东西看起来像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,然后将其余内容放入标题中。