Сопоставлять несловесные символы до тех пор, пока не будут найдены несловесные символы

#regex #pcre

#регулярное выражение #pcre

Вопрос:

Я хочу сопоставить любой несловесный символ с начальной и конечной позиции строки, но если он встретит несловесный символ, который заключает строку, я хочу, чтобы он перестал совпадать прямо перед ним.

Я создал следующий шаблон регулярных выражений:

 ^W (?!(W )((?!1).) 1)?
 

Я ожидал, что оно будет соответствовать, как показано на следующем изображении, поскольку оно будет соответствовать любым несловесным символам с начала строки, пока не достигнет кавычек из шаблона в отрицательном прогнозе:

!@#$%quot;quot;<>тест (строкаquot;)- /;,» src=»https://i.stack.imgur.com/gaTbw.png»></a></p>
<p>Но результат был таким:</p>
<p><a rel=!@#$%quot;quot;<>тест (строкаquot;)- /;,» src=»https://i.stack.imgur.com/vkq1Z.png»></a></p>
<p><a rel=Демонстрационное регулярное выражение 101

Что я делаю не так?

Ответ №1:

Вам нужно использовать

 ^W*?(W)(?=.*?b1W*$)
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • ^ — начало строки
  • W*? — ноль или более несловесных символов, как можно меньше
  • (W) — несловесный символ, захваченный в группу 1
  • (?=.*?b1W*$) — положительный прогноз, соответствующий местоположению, за которым сразу следует
    • .*? — любые нулевые или более символов, кроме символов разрыва строки, как можно меньше
    • b — граница слова
    • 1 — то же значение, что и в группе 1
    • W* — ноль или более символов, не содержащих слов
    • $ — конец строки.

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

1. Да, похоже, это оно. Однако, если не найдено ни одного заключающего символа, он должен просто сопоставлять все несловесные символы с самого начала, пока шаблон не будет нарушен. Если я удалю кавычки в демонстрации, чтобы ничего не было вложено, шаблон ничему не соответствует. Затем оно должно совпадать !@#$%""<> .

2. @KidDiamond Тогда вы также можете сопоставить, если после символа слова могут быть любые символы, кроме последнего несловесного, записанного в группу 1: ^W*?(W)(?=.*?b1W*$|w(?:(?!1).)*$) , см. демонстрацию .

3. Я несколько раз читал этот вопрос, как вы так быстро нашли ответ? 🙂 Блестящее решение

4. @Thefourthbird Этот вопрос уже задавался, а затем удалялся, но он был задан очень неясным образом, поэтому на этот раз я смог быстрее понять суть. Кроме того, немного интуиции помогло.