#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]
, что означает любой символ , который есть в списке, soa
,b
илиc
. Если вы добавляете^
символ в начале списка, то это означает «не эти символы».[^~]
означает поиск одного или нескольких символов, которых нет~
. Это позволит фиксировать фразы между тильдами.- С позитивным взглядом на прошлое покончено
(?<=something present)
. Мы хотим найти тильд, чтобы мы(?<=~)
смотрели как можно более позитивно. Но проблема в том, что он также будет соответствовать тем, у которых впереди несколько тильдов. Чтобы избежать этого, мы можем сказать, что тильд должен иметь либо префикс^
(что означает начало строки), либо[^~]
(что означает не тильд). Чтобы сказать «либо то, либо это», мы используем синтаксис(this|that|or even that)
. Но использование скобок позволит захватить содержимое, а нам это не нужно. Чтобы отключить захват групп, мы можем добавить?:
в начале группы, что, наконец, приводит к(?:[^~]|^)
значению либо символа без тильда, либо начала строки, без его захвата.
Найдите, когда и когда
Регулярное выражение почти такое же. Просто мы заменяем ~
его на ~{2}
или ~{3}
.
- Шаблон для тех случаев, когда:
(?<=(?:[^~]|^)~{2})[^~]
- Образец для потомков:
(?<=(?:[^~]|^)~{3})[^~]
Комментарии:
1. @cattarantadoughan Ахаха! с удовольствием. Да, изучение синтаксиса регулярных выражений занимает некоторое время. Но я должен признать, что я использую их очень часто, так что потраченное время хорошо окупается!