[英]make regex not capture the OR capture group
因此,我正在努力捕获字符串包含什么样的“语言”片段:
语言片段位于()
,并且组合为: En,Fr,De,Es,It
例:
File (En,Fr,De,Es,It).doc <== should match all 5 languages
File (En,Fr) (Required).doc <== should match `En` and `Fr`
File (Enfoo,Fr).doc <== should match only `Fr`
File (E,Fr).doc <== should match only `Fr`
我当前的正则表达式:
((\\(|,)En(\\)|,))|((\\(|,)Fr(\\)|,))|((\\(|,)De(\\)|,))|((\\(|,)Es(\\)|,))|((\\(|,)It(\\)|,))
这是什么意思:
((\(|,) <== either starts with `open parenthesis` or `comma` (1)
En <== the language (2)
(\)|,)) <== either ends with `close parenthesis` or `comma` (3)
然后我只添加正则表达式OR
(|)
如您所见: regexr.com/3ev6p的问题是,如果存在第二个语言代码段,即Fr
,它将不满足正则表达式(1)
因为第一个语言代码段En
已经在捕获/占用open parenthesis
或comma
,导致第二语言片段Fr
不匹配...
你们知道如何处理完全捕获所有语言片段吗? 我打算使用PHP的preg_match_all()
来获取所有这些信息。 希望有人能帮忙。 谢谢!
您拥有的正则表达式消耗了语言代码周围的逗号。 这意味着,找到匹配项后,索引将在逗号后,并且由于无法匹配,因此正则表达式引擎将跳过该逗号后的语言。
为了匹配这样的重叠匹配,可以使用环顾四周:
(?<=[(,])(En|Fr|De|Es|It)(?=[,)])
^^^^^^^^^ ^^^^^^^^
请参阅此正则表达式演示 。
的(?<=[(,])
是正回顾后,需要一个,
或(
语言代码,和之前(?=[,)])
是一个正向前查找需要逗号或)
该语言的右侧代码,但不使用逗号/括号,在下一次迭代期间仍需将其匹配。
此处可能的另一种解决方案是使用单词边界(如注释中所述)。 单词边界有助于匹配整个单词。
\b(En|Fr|De|Es|It)\b
这应该符合所有条件:
(?<=,|\()(\w\w)(?=,|\))
伴随有preg_match_all
应该可以完成这项工作。
解释:
就是这样。 :)
工作版本 。
问候。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.