Определение конкретной строки в начале, середине или конце строки с помощью регулярных выражений - PullRequest
1 голос
/ 20 сентября 2011

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

Моя проблема в том, что я хочу найти строку 'ra' в любой строке, 'ra' будет заменена на 'RA', но дело в том, что я просто хочу заменить 'ra', поскольку она не является частью любое другое слово, например: order_ra заменено на order RA, но камеру нельзя заменить на cameRA.

Я попробовал все готово с [\s|_]ra(?:[\s|_]) и не работает, потому что ищет что-то вроде order_ra или order ra с пробелом в конце. Я хотел бы соответствовать порядку ra или order_ra, либо после него есть пробел, либо нет. Может ли кто-нибудь помочь мне в этом? Я не слишком грамотен с регулярными выражениями.

Причина, по которой я нуждаюсь в этом, заключается в том, что я хочу динамически использовать заглавную букву 'ra' в строке, отправляемой взаимодействием с пользователем, но не в том случае, если она принадлежит слову типа "пришел" * ra * или * ра * одических. Я не знаю, объясняю ли я себя ясно, извините, если нет.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Если я понимаю, что вы ищете, следующий будет выполнять матч.Группа без захвата указывается в скобках с (?:...).Он похож на OP, но также включает в себя якоря начала и конца строки.

(?:^|\s|_)ra(?:$|\s|_)
1 голос
/ 20 сентября 2011

Обычно вы используете границы слов: \bra\b соответствует только ra само по себе, а не внутри слова.К сожалению, подчеркивание рассматривается как буквенно-цифровой символ, поэтому index_ra не будет совпадать.

Поэтому вам нужно реализовать это самостоятельно.Предполагая, что ваш regex dialext поддерживает Unicode и обходные утверждения, используйте

(?<!\p{L})foo(?!\p{L})

Это соответствует foo, но не foobar или bazfoo:

(?<!\p{L}) # Assert that there is no letter before the current position
foo        # Match foo
(?!\p{L})  # Assert that there is no letter after the current position

Если вы можете 't использовать классы символов Unicode, попробуйте это:

(?<![^\W\d_])foo(?![^\W\d_])

Это немного искаженная логика (тройной минус для выигрыша!): [^\W\d_] соответствует букве (= символ, который не является буквенно-цифровымсимвол, а не цифра или подчеркивание), поэтому отрицательные утверждения позволяют убедиться, что вокруг строки поиска нет букв («не a not (не алфавитно-цифровая, не цифра или подчеркивание)»).Скручено, но необходимо, так как мы также хотим, чтобы начало и конец строки соответствовали здесь.

...