我有一个字符串模式,示例如下。
AA4grgrsragrga4334grAA
AAA4323425AAA
AAAAAA%%%AAAAAA
领先的“ A”和结尾的“ A”总是成对出现。
我尝试过:
A+.+A+
不知道如何在REGEX中配对前导As和尾随As。
答案 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的引用$
字符串结尾如果AAA也可以匹配,则可以使用
^(A+)(?:[^A].*[^A]|.)?\1$
答案 2 :(得分:0)
This expression在A+
之间有一个简单的捕获组,可以从左到右在每个非A字符之间滑动:
A+([^A]*)A+
如果您想捕获A+
,可以简单地用两个捕获组()
包装它们,类似于this expression:
(A+)([^A]*)(A+)
如果您不希望匹配A
字符,则可以将其从the expression中删除:
[^A]*
但是,如果两者之间有A,则此匹配项将不匹配,需要进行修改。
该图将表达式可视化,并且如果需要,您可以在此link中测试其他表达式:
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}`);
});
}
此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. ");
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. ");