尝试编写一个可以根据语法分割标题和作者的正则表达式:
作者姓名 - 标题
标题可以包含多个“ - ”。
我有以下正则表达式:([^-]*) - (.*)
这适用于大多数情况,例如
Douglas Adams - Life, The Universe & Everything
分为Douglas Adams
和Life, The Universe & Everything
但双管家作者姓名失败 -
例如我得到Ayize Jama-Everett - Some Book Title
:
作者= Everett
因此,我想更改排除组[^-]
以排除组" - "
,因为名称中的连字符不会包含空格。
我该怎么做?
答案 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,然后将其余内容放入标题中。