动态正则表达式中所有格量词的 JavaScript 替代品

标签 javascript regex pattern-matching reluctant-quantifiers

我正在使用 JavaScript 从我称为“世代”字符串的以逗号分隔的成员字符串中提取“ sibling ”的子集。

打个比方,成员都是同代人,但不都是手足(同父异母)。这是一个例子:

// This is the generation string to search
var generation  = 'ABAA,ABAB,ABAC,ABAD,ABBA,ACAA,ACAB,ACAD,AEAB,AEAD,AFAA';

// This is the member for whom to extract siblings (member included)
var member      = 'ACAA';

生成字符串及其成员具有以下特点:

  • 每个成员的字符数与其他成员相同
  • 字符串的所有成员都按字母排序
  • 每组 sibling 总是彼此相邻
  • sibling 是那些除了最后一个字母外字母组合完全相同的成员

继续这个例子...

// This is how I go about extracting the desired result: ACAA,ACAB,ACAD
var mParent     = member.substr(0, member.length - 1) ;
var mPattern    = mParent + '[A-Z]';
var mPattern    = '(.*)((' + mPattern + ')(,$1)*)(.*)'; // Trouble is here
var mRegex      = new RegExp(mPattern);
var mSiblings   = generation.replace(mRegex, '$2');

上面确定的问题点涉及构造模式中的正则表达式量词。如上,一切都设置为贪心,所以mSiblings的值为:

ACAD

那只是最后一个成员。将 mPattern 更改为不那么贪婪以期提取其他成员会产生以下结果

// Reluctant first expression yields ACAA
var mPattern = '(.*?)((' + mPattern + ')(,$1)*)(.*)'; 

// Reluctant last expression yields ACAD,AEAB,AEAD,AFAA
var mPattern = '(.*)((' + mPattern + ')(,$1)*)(.*?)'; 

// Reluctant first and last yields ACAA,ACAB,ACAD,AEAB,AEAD,AFAA
var mPattern = '(.*?)((' + mPattern + ')(,$1)*)(.*?)';

如果我能让中间的表达式具有所有格,问题就解决了。像这样:

// Make as many "middle" matches as possible by changing (,$1)* to (,$1)*+
var mPattern = '(.*?)((' + mPattern + ')(,$1)*+)(.*?)';

但是正如我所读到的(并且有语法错误可以证明),JavaScript 不支持所有格正则表达式量词。有人可以提出解决方案吗?谢谢。

最佳答案

最明显的问题是$1。在正则表达式中,您可以使用 \1 而不是 $1 来引用捕获组 #1。正则表达式中的 (,$1)* 永远不会匹配任何内容。但无论如何,团体推荐不会有任何好处。

当您在正则表达式中使用组引用时,您不会再次应用正则表达式的那部分,您只是匹配它第一次匹配的相同内容。也就是说,(ACA[A-Z])(,\1)* 将匹配 ACAA,ACAA,但不匹配 ACAA,ACABACAA,ACAC。如果你想这样做,你需要重复实际的正则表达式:(ACA[A-Z])(,ACA[A-Z])*。由于您是动态生成正则表达式,所以这应该不是问题。

请注意,这是整个正则表达式:ACA[A-Z](,ACA[A-Z])*。无需匹配您感兴趣的部分之前或之后的内容;这只会让工作变得更复杂(结果也更令人困惑)。您可以直接访问匹配结果,而不是使用那个“替换”噱头:

var match = mRegex.exec(generation);
if (match != null) {
    mSiblings = match[0];
}

关于动态正则表达式中所有格量词的 JavaScript 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018727/

相关文章:

javascript - 如何用数组中的值替换字符串中的字符?

javascript - 找不到 Qt Creator 导入文件

asp.net - 在运行时设置RegularExpressionValidator ValidationExpression

Erlang:右手边值不匹配

javascript - 解析单个用户输入字符串以获取高级搜索条件

javascript - JQuery 破坏伪类 :hover after executing script

javascript - 正则表达式匹配模式并限制字符数

regex - 用于在 HTML 中查找列表起始端的正则表达式

f# - 在 F# 中匹配元组的不完整模式

javascript - 在 sonarqube 4.5.1 上获取 "exception clearing maxRows/queryTimeout"