正则表达式,如果捕获组匹配字符串
regex if capture group matches string
我需要构建一个简单的脚本来连接罗马尼亚语单词。我见过几个,但他们没有正确执行规则。
var words = "arta codru";
规则:如果 2 个辅音位于 2 个元音之间,则它们在音节之间拆分,除非它们属于此数组,在这种情况下,两个辅音都移动到第二个音节:
var exceptions_to_regex2 = ["bl","cl","dl","fl","gl","hl","pl","tl","vl","br","cr","dr","fr","gr","hr","pr","tr","vr"];
预期结果:ar-ta co-dru
到目前为止的代码:
https://playcode.io/156923?tabs=console&script.js&output
var words = "arta codru";
var exceptions_to_regex2 = ["bl","cl","dl","fl","gl","hl","pl","tl","vl","br","cr","dr","fr","gr","hr","pr","tr","vr"];
var regex2 = /([aeiou])([bcdfghjklmnprstvwxy]{1})(?=[bcdfghjklmnprstvwxy]{1})([aeiou])/gi;
console.log(words.replace(regex2, '-'));
console.log("desired result: ar-ta co-dru");
现在我需要做这样的事情:
if (exceptions_to_regex2.includes(+)){
words.replace(regex2, '-');
}
else {
words.replace(regex2, '-');
}
显然它不起作用,因为我不能像使用常规变量那样只使用捕获组。请帮忙。
您可以将异常编码为模式以在元音之后进行检查,然后停止匹配,或者您仍然可以在另一个元音之前使用任何其他辅音,并用连字符右替换为对整个匹配的反向引用之后:
.replace(/[aeiou](?:(?=[bcdfghptv][lr])|[bcdfghj-nprstvwxy](?=[bcdfghj-nprstvwxy][aeiou]))/g, '$&-')
如果需要不区分大小写的匹配,在g
后添加i
修饰符。
参见regex demo。
详情
[aeiou]
- 元音
(?:
- 非捕获组的开始:
(?=[bcdfghptv][lr])
- 正前瞻要求异常字母簇立即出现在当前位置的右侧
|
- 或
[bcdfghj-nprstvwxy]
- 辅音
(?=[bcdfghj-nprstvwxy][aeiou])
- 后跟任何辅音和元音
)
- 非捕获组结束。
替换模式中的$&
是整个匹配值的占位符(在regex101,[=21=]
此时只能使用,因为该网站不支持特定语言替换模式)。
我需要构建一个简单的脚本来连接罗马尼亚语单词。我见过几个,但他们没有正确执行规则。
var words = "arta codru";
规则:如果 2 个辅音位于 2 个元音之间,则它们在音节之间拆分,除非它们属于此数组,在这种情况下,两个辅音都移动到第二个音节:
var exceptions_to_regex2 = ["bl","cl","dl","fl","gl","hl","pl","tl","vl","br","cr","dr","fr","gr","hr","pr","tr","vr"];
预期结果:ar-ta co-dru
到目前为止的代码: https://playcode.io/156923?tabs=console&script.js&output
var words = "arta codru";
var exceptions_to_regex2 = ["bl","cl","dl","fl","gl","hl","pl","tl","vl","br","cr","dr","fr","gr","hr","pr","tr","vr"];
var regex2 = /([aeiou])([bcdfghjklmnprstvwxy]{1})(?=[bcdfghjklmnprstvwxy]{1})([aeiou])/gi;
console.log(words.replace(regex2, '-'));
console.log("desired result: ar-ta co-dru");
现在我需要做这样的事情:
if (exceptions_to_regex2.includes(+)){
words.replace(regex2, '-');
}
else {
words.replace(regex2, '-');
}
显然它不起作用,因为我不能像使用常规变量那样只使用捕获组。请帮忙。
您可以将异常编码为模式以在元音之后进行检查,然后停止匹配,或者您仍然可以在另一个元音之前使用任何其他辅音,并用连字符右替换为对整个匹配的反向引用之后:
.replace(/[aeiou](?:(?=[bcdfghptv][lr])|[bcdfghj-nprstvwxy](?=[bcdfghj-nprstvwxy][aeiou]))/g, '$&-')
如果需要不区分大小写的匹配,在g
后添加i
修饰符。
参见regex demo。
详情
[aeiou]
- 元音(?:
- 非捕获组的开始:(?=[bcdfghptv][lr])
- 正前瞻要求异常字母簇立即出现在当前位置的右侧|
- 或[bcdfghj-nprstvwxy]
- 辅音(?=[bcdfghj-nprstvwxy][aeiou])
- 后跟任何辅音和元音
)
- 非捕获组结束。
替换模式中的$&
是整个匹配值的占位符(在regex101,[=21=]
此时只能使用,因为该网站不支持特定语言替换模式)。