Регулярные выражения - равное количество символов слева и справа - PullRequest
0 голосов
/ 18 марта 2019

Так что у меня есть это регулярное выражение

[a+][a-z-[a]]{1}[a+]

, которое будет соответствовать строке "aadaa"

, но также будет соответствовать строке "aaaaaaaadaa"

Есть ли способзаставить его совпадать только с теми строками, в которых количество вхождений левой и правой сторон а должно быть одинаковым?

, чтобы совпадать было только "aadaa", а не "aaaaaaaadaa"

Редактировать

С помощью ответа Питера я смог заставить его работать, это рабочая версия для моего требования

(a+)[a-z-[a]]{1}\1

Ответы [ 2 ]

5 голосов
/ 18 марта 2019

Вы можете использовать обратную ссылку следующим образом:

console.log(check("ada"));
console.log(check("aadaa"));
console.log(check("aaaaaaaadaa"));
console.log(check("aaadaaaaaaa"));

function check(str) {
  var re = /^(.*).\1$/;
  return re.test(str);
}

Или только для совпадения a и d:

console.log(check("aca"));
console.log(check("aadaa"));
console.log(check("aaaaaaaadaa"));
console.log(check("aaadaaaaaaa"));

function check(str) {
  var re = /^(a*)d\1$/;
  return re.test(str);
}

Или, чтобы соответствовать только a, которые окружают не-*- 1020 *:

console.log(check("aca"));
console.log(check("aadaa"));
console.log(check("aaaaaaaadaa"));
console.log(check("aaadaaaaaaa"));

function check(str) {
  var re = /^(a*)[b-z]\1$/;
  return re.test(str);
}

Я понимаю, что все вышеперечисленное - это javascript , который легко можно было быстро продемонстрировать в контексте SO.

Я сделал рабочий DotNetFiddle со следующим кодом C #, который похож на все вышеперечисленное:

public static Regex re = new Regex(@"^(a+)[b-z]\1$");

public static void Main()
{
    check("aca");
    check("ada");
    check("aadaa");
    check("aaddaa");
    check("aadcaa");
    check("aaaaaaaadaa");
    check("aadaaaaaaaa");
}

public static void check(string str)
{
    Console.WriteLine(str + " -> " + re.IsMatch(str));
}
0 голосов
/ 18 марта 2019

Вы также можете использовать следующее регулярное выражение для того же самого, хотя я бы предпочел тот, предложенный @ PeterB

console.log(check("aca"));
console.log(check("aadaa"));
console.log(check("aaaaaaaadaa"));
console.log(check("aaadaaaaaaa"));

function check(str) {
  var re = /^(\w+)[A-Za-z]\1$/;
  return re.test(str);
}

Код похож на тот, что был в ответе Питера Б., но я изменил регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...