Regex, чтобы найти строку между чем-то в JavaScript - PullRequest
2 голосов
/ 29 октября 2019

У меня есть две строки:

(username~contains~'ren'~and~status~contains~false)
(status~contains~false~and~username~contains~'ren')

Мне нужно одно регулярное выражение, чтобы найти значение состояния после содержит ~

Я пытаюсь что-то вроде:

/(?<=status~contains~).*?(?=[)])|(?<=status~contains~).*?(?=~)/gi

передать в примере 1: (username~contains~'ren'~and~status~contains~false)
потерпеть неудачу в примере 2: (status~contains~false~and~username~contains~'ren')

Мне нужен только возврат true или false, но во втором примере я получу false~and~username~contains~'ren'

Ответы [ 4 ]

2 голосов
/ 29 октября 2019

Истина или ложь /^(?=.*status~contains~(true|false)).*/
Используйте многострочную опцию, а группа 1 - это значение.

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

1 голос
/ 29 октября 2019
/(?<=status~contains~)[^~)]+(?=[~)])/g

При этом используется вид сзади: status~contains~ и прогноз вида ~ или ). Поэтому мы можем сопоставить 1 или более символов, которые не являются ни ~, ни ) между взглядом назад и взглядом вперед. Это проще и эффективнее, чем использовать .*?.

let re = /(?<=status~contains~)[^~)]+(?=[~)])/g;
let text = "(username~contains~'ren'~and~status~contains~false)" +
           "(status~contains~false~and~username~contains~'ren')";
let m;
while (m = re.exec(text))
    console.log(m[0]);

См. Демонстрацию Regex

1 голос
/ 29 октября 2019

Попробуйте это регулярное выражение:

/(?<=status~contains)~([^~)]+)[~)]/

и получите группу 1 из результата.

1 голос
/ 29 октября 2019

То, что вы можете изменить, это сопоставить ~ или )

(?<=status~contains~).*?(?=[)~])

Regex demo

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

Значение находится в группе 1.

\((?:[^~\r\n]+~)*status~contains~([^~\n]+)(?=[^()]*\)) 
  • \( Соответствует открытию (
  • (?: Группа без захвата
    • [^~\r\n]+~ Совпадение 1+ раз с любым символом, кроме ~ или новой строкой
  • )* Закрыть гуп, повторить 0+ раз
  • status~contains~ Совпадение буквально
  • ( Захват группа 1
    • [^~\n]+ Совпадение 1+ раз с любым символом, кроме ~ или новой строки
  • ) Закрыть группу
  • (?=[^()]*\)) Положительный взгляд вперед, заявитьзакрытие )

Regex demo

const regex = /\((?:[^~\r\n]+~)*status~contains~([^~\n]+)(?=[^()]*\))/g;
const str = `(username~contains~'ren'~and~status~contains~false)
(status~contains~false~and~username~contains~'ren')`;
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++;
  }
  console.log(m[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...