0

尝试编写一个可以拆分标题和作者的正则表达式,语法如下:

作者姓名 - 标题

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

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

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

Douglas Adams - Life, The Universe & Everything

分为Douglas AdamsLife, The Universe & Everything

但对于双桶作者姓名失败 - 例如Ayize Jama-Everett - Some Book Title我得到:

作者 =Everett

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

我该怎么做呢?

4

3 回答 3

3

看起来你需要惰性量词

(.*?) - (.*)

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

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

^(.*?) - (.*)$
于 2012-08-09T20:45:46.103 回答
1

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

在 Python 中:

>>> "Author Name-Hyphen - Book Title".split(" - ")
['Author Name-Hyphen', 'Book Title']
于 2012-08-09T20:53:09.043 回答
-1

除了空格-连字符-空格之外的所有“字符”类看起来都像 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 中,然后将其余部分放入标题中。

于 2012-08-09T20:49:00.643 回答