正则表达式,指定一些循环

时间:2014-01-21 04:57:28

标签: javascript regex

此正则表达式查找具有3个或更少字符的单词,以便可以在它们之前放置不间断的空格。

smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters

有没有办法让表达式只适用于连续2个单词?

实施例

目前,字符串:

Singapore, the USA and Vietnam.

将变为:

Singapore, the USA and Vietnam.

如果表达式仅应用于连续的2个单词,则会显示

Singapore, the USA and Vietnam.

这是完整的脚本:

ragadjust = function (s, method) {

    if (document.querySelectorAll) {

            var eles = document.querySelectorAll(s),
                            elescount = eles.length,

                            smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters

            while (elescount-- > 0) {

                    var ele = eles[elescount],
                                    elehtml = ele.innerHTML;

                    if (method == 'small-words' || method == 'all') 

                            // replace small words
                            elehtml = elehtml.replace(smallwords, function(contents, p1, p2) {
                    return p1 + p2.replace(/\s/g, ' ');
                });


                ele.innerHTML = elehtml;

            }
    }
};

这是RagAdjust

2 个答案:

答案 0 :(得分:0)

我知道这不是你要求的,但我认为代码审查不会受到影响:

  • 我认为边界\b在这种情况下比\s|^更好。
  • 您的匹配中包含A-Za-z个字符,但您使用i不区分大小写的运算符。
  • {0,1}?是多余的 - 要么使用?使其成为可选项,要么使用{0,1}使其匹配为零或一次。
  • 如果您的字符集中有短划线,请将其放在最后,这样您就没有模糊的正则表达式,例如[a-z_-][a-z-_]要好得多。< / LI>
  • 如果您不需要捕获值,请使用非捕获括号(?:)

所以,这是你的清理正则表达式:

/\b((?:[a-z_(-]{1,2}(?:'|’)*[a-z_,;-]?\s)+)/gi

我很确定当你从编辑器粘贴这个时,'|’位是某种拼写错误。不确定它应该是什么。

答案 1 :(得分:0)

这并没有像你建议的那样解决问题,但它确实减少了最终在字符串中的非中断空格的数量。但它可能会给你一些见解。因为在两个正则表达式替换上都有尾随g,所以您正在进行全局替换。如果你用一些最大数量的修复来循环它,那么事情会有所不同。

尝试更改最大替换次数。我认为在这里发生的另一件事(在我的修改后的代码中)是在你进行一次替换之后,空格和小单词都消失了,因为你堵塞了nbsp这可能会或可能不会解决你的问题试图绕开。

这是我的替换功能(从原版中简化)。基本mod是从正则表达式中删除g并添加循环。您应该查看codepen以查看完整的交易

var new_ragadjust = function (contents) {

  MAX_NUMBER_OF_REPLACEMENTS = 5;

  smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/i; // words with 3 or less characters

  var ii = 0;

  var c = contents;
  for (;ii < MAX_NUMBER_OF_REPLACEMENTS; ++ii) {
    c = c.replace(smallwords, function(contents, p1, p2) {
      return p1 + p2.replace(/\s/, '&#160;');
    });
  }
 return c;

};

Codepen http://cdpn.io/DKLtc

另外,要看到差异,您需要检查元素以实际查看nbsp最终的位置(您可能已经知道)。