Regex: найти строки без символа - PullRequest
0 голосов
/ 21 ноября 2018

Я строю регулярное выражение, которое соответствует 2 буквам или 2 буквам, за которыми следуют '/' и следующие 2 буквы, например:

rt bl/ws se gn/wd wk bl/rt

/^(((\s+)?[a-zA-Z]{2}(\/[a-zA-Z]{2})?)(\s+|$))+$/i

, и это работает без проблем.Следующая проблема, которую я имею, состоит в том, чтобы сопоставить все слова, не содержащие символ «/».и замените все совпадения дублирующимися значениями, разделенными символом /Для вышеприведенного примера исключение должно быть:

rt/rt bl/ws se/se gn/wd wk/wk bl/rt

Я пробовал это некоторое время, но безуспешно.Не могли бы вы помочь мне с этим?

Обновление 1:

Я начал с регулярного выражения, которое соответствует словам, не содержащим 'at'

(\b((?!(at))\w)+\b)

И я хочу заменить соответствующие элементы на python, например

re.sub(r'(\b((?!(at))\w)+\b)', r'\1/\1', text)

, но сначала нужно найти правильные элементы ...

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

в Python вы можете сделать что-то вроде:

re.sub(r'(?:(?<=^)|(?<= ))(\w+)(?= )',r'\1/\1','rt bl/ws se gn/wd wk bl/rt')

'rt/rt bl/ws se/se gn/wd wk/wk bl/rt'
0 голосов
/ 21 ноября 2018

Если вы используете разновидность регулярного выражения, которая поддерживает отрицательный взгляд, то это регулярное выражение должно найти строки, которые вы хотите заменить:

(?<!\/)([A-Za-z]{2}(?!\/))

(?<!\/) - убедитесь, что нет/ за матчем
([A-Za-z]{2} ищет два буквенных символа
(?!\/)) гарантирует, что нет трейлинга /

В Python вы бы использовали его какthis:

print(re.sub(r'(?<!\/)([A-Za-z]{2}(?!\/))',r'\1/\1','rt bl/ws se gn/wd wk bl/rt'))

Вывод:

rt/rt bl/ws se/se gn/wd wk/wk bl/rt

Демонстрация на rextester

В PHP вы будете использовать его так:

$str = 'rt bl/ws se gn/wd wk bl/rt';
echo preg_replace('/(?<!\/)([A-Za-z]{2}(?!\/))/', '$1/$1', $str);

Выход:

rt/rt bl/ws se/se gn/wd wk/wk bl/rt

Демонстрация на 3v4l.org

...