如何找到双字母并将其替换为三字母?

时间:2019-06-03 00:09:05

标签: regex regex-group backreference

我没有使用任何特定的编码语言,只是一个带有“ find”和“ replace”的程序,其中两个字段都使用Regex。例如,短语

let testObjectOne = {
            'title': $title.val(),
            'typ': $typ.val(),
            'assign': $assign.val(),
            'files': $file.val().match(/[\/\\]([\w\d\s\.\-\(\)]+)$/)[0],
            'priority': $priority.val(),
            'category': $category.val(),
            'textField': $textField.val(),
            'end_date': $date.val(),
            'id': 0,
        };
        if (localStorage.getItem('key') === null) {
            localStorage.setItem('id', "0");
            let temp_Array = [];
            temp_Array.push(testObjectOne);
            localStorage.setItem('key', JSON.stringify(temp_Array));
        } else {
            let id_value = localStorage.getItem('id');
            let temp_array = JSON.parse(localStorage.getItem('key'));
            id_value++;
            testObjectOne['id'] = id_value;
            temp_array.push(testObjectOne);
            localStorage.setItem('key', JSON.stringify(temp_array));
            localStorage.setItem('id', id_value);
        }

会变成

too many professionals

我想“发现”任何出现的重复字母,我知道我可以解决

tooo many professsionals

让我感到困惑的是“把字母加倍并加倍”。正则表达式中是否有任何符号提及“当前字符”或类似的东西?

编辑:谢谢大家的建议。事实证明,“替换”字段实际上并未使用正则表达式,而IMO是正则表达式,而我的问题现在毫无价值。

5 个答案:

答案 0 :(得分:3)

使用反向引用的当前模式(.)\1在右边。尝试查找并替换:

Find:    (.)\1
Replace: $1$1$1

Demo

此方法匹配任何单个字母后跟相同字母,然后用相同字母中的三个替换该对。

答案 1 :(得分:3)

Tim的表达式不正确,因为(.)引用了任何字符,我们不希望替换它。我们只希望替换(英文)字母或[A-Za-z]

正确的方法可能是带有i标志的表达式:

([a-z])\1

或者可能是没有i标志的表达式:

([A-Za-z])\1

Demo

测试

const regex = /([a-z])\1/gmi;
const str = `too many   professionals
would    turn into

tooo many professsionals`;
const subst = `$1$1$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 2 :(得分:3)

两倍至三倍

找到(?m)(?:([a-zA-Z])(?!\1)|^)(([a-zA-Z])\3)(?!\3)
替换$1$2$3

https://regex101.com/r/tOpl82/1

解释

 (?m)                          # Multi-line mode     
 (?:
      ( [a-zA-Z] )                  # (1), Character behind
      (?! \1 )                      #      not a dup.
   |                              # or, 
      ^                             # BOL
 )
 (                             # (2 start)
      ( [a-zA-Z] )                  # (3), Character to dup check
      \3                            #      this is duped.
 )                             # (2 end)
 (?! \3 )                      # The dup can't be a triple

答案 3 :(得分:1)

这几乎是您的问题的一部分:)。

这还取决于您使用的正则表达式的味道。

例如对于gnu sed,是

$ echo 'ffoobarr' | sed -e 's/\(.\)\1/\1\1\1/g'
fffooobarrr

所以,要使它变得三重,我只是使用\1\1\1作为替换模式。

答案 4 :(得分:1)

考虑到已经三重的字母不应该附加四分之一的另一个想法。

(([A-Za-z])\2\2+)|(\w)\3

替换为:

$1$3$3$3

这个想法是在第一组三联或更多字母|或第三组中捕获双字母。只有一个组可以匹配:组1或组3。在替换中,任何一个组将始终为空。

Here is the demo at regex101