我一直在敲打表达一个多小时,没有结果。所以是时候寻求帮助了。
以下(多行)文字:
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:华尔兹“
第一个表达式我做错了什么?
答案 0 :(得分:1)
如果您尝试匹配不在一行开头的vol / vol。/ volume,则以下内容应该有效:
^.+(vol\.?|volume)
^.+
表示匹配行开头的1个或多个字符
(vol\.?|volume)
表示匹配vol
后跟可选.
或匹配volume
答案 1 :(得分:1)
这就是你的正则表达式没有按预期工作的原因
<
。它应该是(?<!^)
(?:vol[ume]*\.*)
之前立即(?m)
(不使用^
只匹配输入的开头)因此,这些修正的正则表达式变为
(?m),*\s*(?<!^)(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)
以上工作但可以进一步改进。 [ume]*
的使用也可以让voleee
,volmeu
等匹配,而不是与*
无关,,
和.
可以使?
成为可选项。
(?m),?\s*(?<!^)(?:vol\.?|volume)\s*(?=[0-9A-Z]+)
答案 2 :(得分:0)
坚持下去,而不是与之斗争:
^.+\s*(?:vol[ume]*\.*)\s*(?=[0-9A-Z]+)
在该行的开头强制匹配(^
),然后一个或多个字符...