#regex #pcre
#регулярное выражение #pcre
Вопрос:
Я хочу сопоставить любой несловесный символ с начальной и конечной позиции строки, но если он встретит несловесный символ, который заключает строку, я хочу, чтобы он перестал совпадать прямо перед ним.
Я создал следующий шаблон регулярных выражений:
^W (?!(W )((?!1).) 1)?
Я ожидал, что оно будет соответствовать, как показано на следующем изображении, поскольку оно будет соответствовать любым несловесным символам с начала строки, пока не достигнет кавычек из шаблона в отрицательном прогнозе:
Демонстрационное регулярное выражение 101
Что я делаю не так?
Ответ №1:
Вам нужно использовать
^W*?(W)(?=.*?b1W*$)
Смотрите демонстрацию регулярных выражений. Подробные сведения:
^
— начало строкиW*?
— ноль или более несловесных символов, как можно меньше(W)
— несловесный символ, захваченный в группу 1(?=.*?b1W*$)
— положительный прогноз, соответствующий местоположению, за которым сразу следует.*?
— любые нулевые или более символов, кроме символов разрыва строки, как можно меньшеb
— граница слова1
— то же значение, что и в группе 1W*
— ноль или более символов, не содержащих слов$
— конец строки.
Комментарии:
1. Да, похоже, это оно. Однако, если не найдено ни одного заключающего символа, он должен просто сопоставлять все несловесные символы с самого начала, пока шаблон не будет нарушен. Если я удалю кавычки в демонстрации, чтобы ничего не было вложено, шаблон ничему не соответствует. Затем оно должно совпадать
!@#$%""<>
.2. @KidDiamond Тогда вы также можете сопоставить, если после символа слова могут быть любые символы, кроме последнего несловесного, записанного в группу 1:
^W*?(W)(?=.*?b1W*$|w(?:(?!1).)*$)
, см. демонстрацию .3. Я несколько раз читал этот вопрос, как вы так быстро нашли ответ? 🙂 Блестящее решение
4. @Thefourthbird Этот вопрос уже задавался, а затем удалялся, но он был задан очень неясным образом, поэтому на этот раз я смог быстрее понять суть. Кроме того, немного интуиции помогло.