【问题标题】:regex if capture group matches string正则表达式如果捕获组匹配字符串
【发布时间】:2018-11-18 12:17:51
【问题描述】:

我需要构建一个简单的脚本来连接罗马尼亚语单词。我见过几个,他们没有正确执行规则。

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, '$1$2-'));
console.log("desired result: ar-ta co-dru");

现在我需要做这样的事情:

if (exceptions_to_regex2.includes($2+$3)){
  words.replace(regex2, '$1-');
}
else {
  words.replace(regex2, '$1$2-');
}

显然它不起作用,因为我不能像使用常规变量那样只使用捕获组。请帮忙。

【问题讨论】:

  • 试试.replace(/[aeiou](?:(?=[bcdfghptv][lr])|[bcdfghj-nprstvwxy](?=[bcdfghj-nprstvwxy][aeiou]))/g, '$&-'),见demo
  • 谢谢。如果您将添加作为答案,我会接受。坦率地说,我什至没有想过要这样看。我想找到一种将捕获的组用作js变量的方法

标签: javascript regex regex-group


【解决方案1】:

您可以将您的异常编码为一个模式以在元音之后检查,然后停止匹配,或者您仍然可以在另一个元音之前使用任何其他辅音,并在后面用连字符替换整个匹配的反向引用:

.replace(/[aeiou](?:(?=[bcdfghptv][lr])|[bcdfghj-nprstvwxy](?=[bcdfghj-nprstvwxy][aeiou]))/g, '$&-')

如果您需要不区分大小写的匹配,请在g 之后添加i 修饰符。

请参阅regex demo

详情

  • [aeiou] - 元音
  • (?: - 非捕获组的开始:
    • (?=[bcdfghptv][lr]) - 正向前瞻,要求异常字母簇立即出现在当前位置的右侧
    • | - 或
    • [bcdfghj-nprstvwxy] - 辅音
    • (?=[bcdfghj-nprstvwxy][aeiou]) - 后跟任何辅音和元音
  • ) - 非捕获组结束。

替换模式中的 $& 是整个匹配值的占位符(在 regex101 中,$0 只能在此时使用,因为网站不支持仅针对特定语言的替换模式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2018-05-11
    • 1970-01-01
    • 2016-06-18
    • 2016-12-15
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多