JavaScript动态正则表达式中所有格量词的替代
JavaScript Alternative To Possessive Quantifiers In Dynamic Regex
我正在使用JavaScript从我称为"generation"字符串的以逗号分隔的成员字符串中提取"兄弟"的子集。
比喻地说,成员都来自同一代,但他们不都是兄弟姐妹(来自同一父母)。下面是一个例子:
// 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';
生成字符串及其成员具有以下特征:
- 每个成员的字符数与其他成员相同
- 字符串的所有成员都按alpha排序
- 每一组兄弟姐妹将始终彼此相邻
- 兄弟姐妹是指除了最后一个字母 之外具有完全相同字母组合的成员
继续这个例子…
// 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,ACAB
或ACAA,ACAC
。如果您想这样做,您需要重复实际的regex: (ACA[A-Z])(,ACA[A-Z])*
。由于您正在动态生成正则表达式,因此这应该不是问题。
注意这是整个正则表达式:ACA[A-Z](,ACA[A-Z])*
。没有必要将你感兴趣的部分前后的内容进行匹配;这只会让工作变得更复杂(结果也更令人困惑)。您可以直接访问匹配结果,而不是使用"replace"技巧:
var match = mRegex.exec(generation);
if (match != null) {
mSiblings = match[0];
}
相关文章:
- 如何在Angular中的表的所有单元格中添加链接
- 高图热图:单击按钮或复选框时选择所有单元格
- PHPExcel搜索/返回单元格中包含特定值的所有行
- 如何使用 jquery sortable 对表的所有行中的表单元格进行排序
- 西格玛.js所有节点上的边界
- 如何在当前行中突出显示拖动开始和拖动结束之间的所有单元格,拖动只能是当前选择行
- 使用 JQuery 和 Ajax 访问单击的单元格而不是所有单元格
- 我正在尝试在大范围内挑选特定单元格中带有“1”的所有行,是否有更有效的方法可以做到这一点
- 单击重置按钮时更改所有表格单元格的颜色
- 如何将按钮添加到可手动接触的列的所有单元格中
- 选择除前两列中的单元格外的所有单元格
- 将表中相同点击行的所有单元格值加载到数组中,但第一个和最后一个<td>
- 克隆html TR并不是克隆所有单元格值
- 拖放动态生成的两个表之间的所有单元格
- 如何打印单元格内从1到totalDays的所有日期
- 对表单元格的Ng-change更新所有单元格
- Slickgrid自定义单元格编辑器更新所有单元格
- Jquery选择器所有单元格在表中,除了
- Jquery可满足所有单元格而不是行
- JavaScript动态正则表达式中所有格量词的替代