正则表达式找到两个共享匹配字符的相同类型

时间:2018-02-18 10:26:46

标签: regex

我有正则表达式:

/(?:(?:\b|_)([a-z][a-z])(?:\b|_))/gi

和一个字符串:

of  Us_AR.xyz

正则表达式与ofUs匹配,但我还需要AR。 似乎_已被“使用”以匹配Us,因此无法与AR匹配?

我能解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果您只想在字符串开头提取下划线两侧的单词,那么为什么不使用以下模式:

([A-Z]+)\s+([A-Z]+)_([A-Z]+)

您想要的三个匹配项将在第一个到第三个捕获组中可用。

var input = "of    Us_AR.xyz";
var pattern = /([A-Z]+)\s+([A-Z]+)_([A-Z]+)/gi;
var match = pattern.exec(input);
console.log(match[1]);
console.log(match[2]);
console.log(match[3]);

答案 1 :(得分:0)

你可以使用负向前看:

/(?:[^a-z]|^)([a-z]{2})(?![a-z])/gi

在JS中无法查看背后的内容,因此您不应该处理第一个非捕获组中匹配的内容,而只应处理仅在捕获组中捕获的内容。

  • [^a-z]|^:匹配非字母或字符串的开头(^
  • [a-z]{2}:匹配2个字母
  • (?![a-z]):要求下面没有字母,但不会捕获它。

第一个表达式放在(?: )中,因此它不能用作捕获组。第二个表达式放在( )中,以便您可以引用它。