RegEx匹配表达式NOT不在一行的开头

时间:2013-07-06 02:07:37

标签: java regex regex-lookarounds

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

以下(多行)文字:
Waltzes vol 15
Waltzes vol。 15
Waltzes vol。 以A
Waltzes ,音量 15
音量 15:华尔兹

粗体中的部分是我迄今为止提出的RegEx的匹配:
(?!^),*\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
Waltzes opus 15
作品15:华尔兹“

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

3 个答案:

答案 0 :(得分:1)

如果您尝试匹配不在一行开头的vol / vol。/ volume,则以下内容应该有效:

^.+(vol\.?|volume)

^.+表示匹配行开头的1个或多个字符

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

答案 1 :(得分:1)

这就是你的正则表达式没有按预期工作的原因

  • 缺少负面的背后隐藏<。它应该是(?<!^)
  • lookbehind应该在(?:vol[ume]*\.*)之前立即
  • 您需要启用多行(?m)(不使用^只匹配输入的开头)

因此,这些修正的正则表达式变为

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

以上工作但可以进一步改进。 [ume]*的使用也可以让voleeevolmeu等匹配,而不是与*无关,,.可以使?成为可选项。

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

答案 2 :(得分:0)

坚持下去,而不是与之斗争:

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

在该行的开头强制匹配(^),然后一个或多个字符...