1

我一直在用一个多小时的表情敲打我的头,但没有结果。所以是时候寻求帮助了。

在以下(多行)文本中:
Waltzes vol 15
Waltzes vol. 15
华尔兹卷。华尔兹15卷第 15 卷
华尔兹

粗体部分是我迄今为止提出的正则表达式的匹配项:
(?!^),*\s*(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)

所有的都是正确的,除了最后一个,因为它在一行的开头,所以不应该包括在内。
据我可以从http://www.regular-expressions.info/refadv.html的文档中得知,表达式中的(?!^)环视部分应排除,*\s*(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)在行首找到的匹配项,但这并不似乎工作。

另一方面,表达式(?!^)op[us]*\.*\s*(?=[0-9]+)可以正常工作,并且不会在以下文本的最后一行返回匹配项:
Waltzes op。
华尔兹15首,作品15
作品 15:华尔兹

第一个表达我做错了什么?

4

3 回答 3

1

如果您尝试匹配不在行首的 vol/vol./volume,则应使用以下方法:

^.+(vol\.?|volume)

^.+表示从行首匹配 1 个或多个字符

(vol\.?|volume)表示匹配vol后跟可选的.或匹配volume

于 2013-07-06T02:18:26.430 回答
1

这就是您的正则表达式未按预期工作的原因

  • 消极的后视不见了<。它应该是(?<!^)
  • 后视应(?:vol[ume]*\.*)立即先于
  • 您需要启用多行(?m)(没有它^只会匹配输入的开头)

因此,带有这些更正的正则表达式变为

(?m),*\s*(?<!^)(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)

上述工作,但可以进一步改进。的使用[ume]*也会让匹配像voleeevolmeu。而不是不受限制地使用*,,并且.可以使用?.

(?m),?\s*(?<!^)(?:vol\.?|volume)\s*(?=[0-9A-Z]+)
于 2013-07-06T02:41:25.067 回答
0

顺其自然,而不是与之抗争:

^.+\s*(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)

在行首强制匹配 ( ^),后跟一个或多个字符...

于 2013-07-06T02:19:11.087 回答