RegEx用于匹配除开始和结束处的重复字符外的所有内容

时间:2019-05-11 08:45:43

标签: regex regex-negation regex-lookarounds regex-group regex-greedy

我有一个字符串模式,示例如下。

AA4grgrsragrga4334grAA

AAA4323425AAA

AAAAAA%%%AAAAAA

领先的“ A”和结尾的“ A”总是成对出现。

我尝试过:

A+.+A+

不知道如何在REGEX中配对前导As和尾随As。

3 个答案:

答案 0 :(得分:2)

捕获组中的首字母As,然后重复匹配任何字符,后跟非A,然后再次反向引用第一个组,然后是字符串的结尾:

^(A+).*[^A]\1$

https://regex101.com/r/81ge2k/2

如果A仅出现在字符串的开头和结尾,则可以改用负字符集:

^(A+)[^A]*\1$

如果输入字符串应该跨越整行,请确保使用字符串开头和字符串结尾锚,否则该模式可以匹配不匹配的A

答案 1 :(得分:0)

如果您想在字符串的开头和结尾匹配成对的A,例如AA或AAAAAA以及AAteAstAA,则可以使用替代:

^(A+)(?:[^A].*[^A]|[^A])?\1$

关于图案

  • ^字符串的开头
  • (A+)在与1个A以上的匹配的第一组中捕获
  • (?:非捕获组
    • [^A].*[^A]不匹配A,0乘以除换行符以外的任何字符,然后再次不匹配
    • |
    • [^A]不匹配A
  • )?关闭非捕获组并将其设置为可选
  • \1返回组1的引用
  • $字符串结尾

Regex demo

如果AAA也可以匹配,则可以使用

^(A+)(?:[^A].*[^A]|.)?\1$

Regex demo

答案 2 :(得分:0)

This expressionA+之间有一个简单的捕获组,可以从左到右在每个非A字符之间滑动:

A+([^A]*)A+

enter image description here


如果您想捕获A+,可以简单地用两个捕获组()包装它们,类似于this expression

(A+)([^A]*)(A+)

enter image description here


如果您不希望匹配A字符,则可以将其从the expression中删除:

[^A]*

但是,如果两者之间有A,则此匹配项将不匹配,需要进行修改。


RegEx描述图

该图将表达式可视化,并且如果需要,您可以在此link中测试其他表达式:

enter image description here

JavaScript测试

const regex = /(A+)([^A]*)(A+)/gm;
const str = `AA4grgrsragrga4334grAA
AAA4323425AAA
AAAAAA%%%AAAAAA`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

(A +)([^ A] *)(A +)的基本性能测试

此JavaScript代码段返回100万次for循环以提高性能。

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = 'AAAAAAAAAanyThingElse4grgrsragrga4334grAAAA';
	const regex = /(A+)([^A]*)(A+)/gm;
	var match = string.replace(regex, "\nGroup #1: $1\nGroup #2: $2\nGroup #3: $3\n");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");

A +([^ A] *)A +的基本性能测试

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = 'AAAAAAAAAanyThingElse4grgrsragrga4334grAAAA';
	const regex = /A+([^A]*)A+/gm;
	var match = string.replace(regex, "Group #1: $1");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");