【问题标题】:Regex match character in words of certain length正则表达式匹配特定长度单词中的字符
【发布时间】:2013-10-08 08:47:34
【问题描述】:

我正在尝试创建一个匹配特定长度单词中的一组字符的正则表达式。

带有hello goodbye low loving列表的AKA

字长为 5 或更大 匹配 l 的字符[它将匹配l l lhello 中的两个和loving 中的一个)]。

我需要这个来替换用例。

因此将字母替换为£ 会输出

he££o goodbye low £oving

我指的是这个问题,regular-expression-match-a-word-of-certain-length-which-starts-with-certain-let,但我不知道如何将匹配符号从整个单词更改为单词中的一个字符。

我有,但我需要将字长检查添加到匹配的正则表达式中。

myText = myText.replace(/l/g, "£");

【问题讨论】:

  • 请多写点:应该做哪些替换? heRo goodbye low Roving ?
  • 提供输入和预期输出。发布不符合预期的代码。
  • 看看这个fiddle。这是你想要的吗?
  • 已编辑...代码非常少,因为我唯一缺少的是正则表达式。
  • @Harry... 我曾考虑过这两个步骤的方法。但是我想省去每次都需要重建我需要返回的字符串,诅咒不可变的字符串:P!

标签: javascript regex str-replace


【解决方案1】:

你可以像这样使用匿名函数:

var str = 'hello goodbye low loving';
var res = str.replace(/\b(?=\S*l)\S{5,}/g, function(m) {
    return m.replace(/l/g, "£");
});
alert(res);

jsfiddle

我使用前瞻只是为了不为每个 5 个(或更多)字母的单词调用匿名函数。

编辑:快一点的正则表达式是:\b(?=[^\sl]*l)\S{5,}

如果 JS 曾经支持所有格量​​词,这将更快:\b(?=[^\sl]*+l)\S{5,}


正则表达式的解释

\b         // matches a word boundary; prevents checks in the middle of words
(?=        // opening of positive lookahead
   [^\sl]* // matches all characters except `l` or spaces/newlines/tabs/etc
   l       // matches a single l; if matched, word contains at least 1 `l`
)          // closing of positive lookahead
\S{5,}     // retrieves word on which to run the replace

【讨论】:

  • 有什么用?很性感,但可能会让整个事情在大字和大文本上有点呆滞?我想我必须将它添加到测试中。
  • @tigerswithguitars 您可以使用[^\sl]* 而不是\S* 加快速度。如果 JS 支持所有格量​​词,那会更快:)
  • @Jerry... 不认为您知道任何解释这一点的文档吗?我喜欢这个食谱,但我至少想尝试理解它。
  • @tigerswithguitars 当然。这里引用最多的网站,以及描述所有格量词的页面是here。基本上,使正则表达式变慢的原因是回溯并再次测试相同的东西(就像一台顽固的机器确信存在匹配,它会在没有完全逻辑思考的情况下寻找每一种可能性)占有量词防止回溯,因此正则表达式不会检查太多和最初一样。
  • 即使回溯它也比我的答案快,所以+1;不过,这种表达方式更难理解 :)
【解决方案2】:

这应该可行:

var s='hello goodbye low loving';
r = s.replace(/\S{5,}/g, function(r) { return r.replace(/l/g, '£'); } );
// he££o goodbye low £oving

【讨论】:

  • 嵌套替换为匿名函数!非常整洁,我不知道你可以做到这一点。看起来不错。
猜你喜欢
  • 2012-02-21
  • 2019-01-04
  • 2011-06-17
  • 2012-03-27
  • 2013-06-10
  • 2010-11-17
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多