Регулярное выражение Dart для захвата групп, но игнорирующее некоторые аналогичные шаблоны

#regex #dart

Вопрос:

Я пытаюсь захватить группу из строки с символами ~, ~~ и~~~. Мне удалось извлечь отдельные символы, но это не игнорирует другие вхождения в строку.

Это мой код, с которым я пытался поэкспериментировать:

 String f = '~the calculator is on and working~I entered 50 into the calculator' 
    '~~I press add button~~holding equal button ~~~The result should be 50';

List<String>givens = f.split(RegExp(r'~ '));
List<String>whens = f.split(RegExp(r'~~ '));
List<String>thens = f.split(RegExp(r'~~~ '));

for(String ss in givens){
  print(ss);
}
print('xxxxxxxxxxxx');
for(String ss in whens){
  print(ss);
}
print('xxxxxxxxxxxx');
for(String ss in thens){
  print(ss);
}
 

Что приведет к:
введите описание изображения здесь

Группа захвата Гивенса также захватила тех, у кого есть ~~ и ~~~, что не предназначено. Группа захвата whens также захватила тех, кто был одинок ~ , что делало это очень запутанным. Наконец, группа захвата thens также захватила остальных, что также не предназначено.

Мне нужно только захватить строки, начинающиеся с определенного шаблона, но остановятся, когда они увидят другой.

Пример: givens должен записывать только «калькулятор включен и работает» и «я ввел в калькулятор только 50«.

Любые подсказки или помощь будут высоко оценены!

Комментарии:

1. ~ означает «Найдите персонажа ~ один или несколько раз», так что это нормально, что он соответствует ~~ ~~~ или даже ~~~~~~ . Если вы просто хотите сопоставить 2 тильда, то вам нужно использовать либо ~~ или ~{2} где {2} означает ровно два раза. Если бы вы хотели сопоставить 3, 4 или 5 тильдов, то это было бы так ~{3,5} . Надеюсь, это поможет вам понять вашу проблему.

2. Извлеките их путем сопоставления, учитывая — (?<!~)~([^~] )(?=~|$) ( демонстрация ), когда — (?<!~)~~([^~] )(?=~~|$) ( демонстрация ) и thens (?<!~)~~~([^~] )(?=~~~|$) ( демонстрация )

3. Спасибо вам за предложения! попробуем это сейчас

Ответ №1:

Я думаю, проблема в том, что вы начали с разделения строки на части. Но может быть проще искать элементы с шаблоном, который будет искать некоторый текст, предваряемый одним, двумя или тремя ~ символами.

Это можно сделать с помощью регулярных выражений положительных шаблонов поиска.

Как правило, если вы хотите найти строку, которой предшествует один тильд, вам нужно избегать совпадения, если перед ней есть другие тильды.

Найти данности

(?<=(?:[^~]|^)~)[^~] было бы закономерностью находить только данности.

Проверьте это здесь: https://regex101.com/r/9WLbM3/2

Объяснение

  • [^~] означает поиск любого символа, который не является a ~ . Это потому [abc] , что означает любой символ , который есть в списке, so a , b или c . Если вы добавляете ^ символ в начале списка, то это означает «не эти символы».
  • [^~] означает поиск одного или нескольких символов, которых нет ~ . Это позволит фиксировать фразы между тильдами.
  • С позитивным взглядом на прошлое покончено (?<=something present) . Мы хотим найти тильд, чтобы мы (?<=~) смотрели как можно более позитивно. Но проблема в том, что он также будет соответствовать тем, у которых впереди несколько тильдов. Чтобы избежать этого, мы можем сказать, что тильд должен иметь либо префикс ^ (что означает начало строки), либо [^~] (что означает не тильд). Чтобы сказать «либо то, либо это», мы используем синтаксис (this|that|or even that) . Но использование скобок позволит захватить содержимое, а нам это не нужно. Чтобы отключить захват групп, мы можем добавить ?: в начале группы, что, наконец, приводит к (?:[^~]|^) значению либо символа без тильда, либо начала строки, без его захвата.

Найдите, когда и когда

Регулярное выражение почти такое же. Просто мы заменяем ~ его на ~{2} или ~{3} .

  • Шаблон для тех случаев, когда: (?<=(?:[^~]|^)~{2})[^~]
  • Образец для потомков: (?<=(?:[^~]|^)~{3})[^~]

Комментарии:

1. @cattarantadoughan Ахаха! с удовольствием. Да, изучение синтаксиса регулярных выражений занимает некоторое время. Но я должен признать, что я использую их очень часто, так что потраченное время хорошо окупается!