Regex находит экземпляр тире, но не <space>тире <space> - PullRequest
0 голосов
/ 01 декабря 2018

Я ооочень близко.Я пытаюсь кодировать выражение регулярного выражения для Notepad ++, чтобы заменить тире пробелом, игнорируя тире уже с пробелом до / после.Я понимаю, что могу найти / заменить "-" на "foobarfoo", затем найти "-", заменив "", а затем преобразовав "foobarfoo" обратно в "-", но, черт возьми, я пытаюсь выучить регулярные выражения!

Вот моя проблема:

Адаптер - BNC Мужской к BNC-Женский, Прямой угол

к

Адаптер - BNC Мужской кBNC Female, Right Angle

(обратите внимание на исчезающую черту в "BNC Female")

Ближайшее, что я получаю, использует это: /(?:[^( )])\-(?:[^( )])/g

, ноэто приводит к тому, что он находит одну букву впереди, черту и следующую букву:

Адаптер - BNC Мужской к BN CF emale, Прямой угол

ПОЧЕМУ он выбирает символы пре / пост?Разве это не:

(?:[^( )]) найти что-нибудь кроме пробела (в качестве группы без захвата) ...

\- ..., которая следует за дефисом ...

(?:[^( )]) ... и за ним следует все, кроме пробела (в качестве группы без захвата)

Я еще ближе, я заменяю первый член на (?=[^( )]), но если я изменяю третий членна (?![^( )]) Я вернулся к тому, с чего начал - просто выбрал тире между двумя пробелами.GRRRR.

Больше образцов здесь http://regexr.com/444i2

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Используйте \w(-)\w, чтобы заменить все дефисы, окруженные буквенными символами, цифрами и подчеркиванием, или [^ ](-)[^ ], чтобы заменить все дефисы, окруженные непробельными символами.

Оба отлично работают в моей версии Notepad ++ со всемииз ваших примеров.

0 голосов
/ 01 декабря 2018

Наиболее читаемым параметром для Notepad ++ является регулярное выражение на основе чередования с шаблоном условной замены:

Find What : (\s-\s)|- Заменить на : (?1$1: )

Шаблон (\s-\s)|- либо захватывает в Группу 1 пробел, - и пробел, либо просто соответствует -.Если группа 1 совпадает, ее значение вставляется обратно туда, где оно было (= это совпадение пропускается), иначе - в других контекстах заменяется пробелом.

См. Демонстрацию ниже: enter image description here

Другой вариант - использование вложенных поисков:

Find What : -(?<!\s-(?!=\s)) Заменить на : (пробел)

Шаблон соответствует:

  • - - дефис
  • (?<!\s-(?!=\s))- этот отрицательный вид сзади не дает совпадения, если его шаблон соответствует следующему шаблону непосредственно слева от текущего местоположения (то есть сразу после -):
    • \s - пробел
    • - - дефис (это необходимо для того, чтобы убедиться, что мы попадаем в то же место, где сработало lookbehind)
    • (?!=\s) - следующий символ - это пробел (это предвидение, этоневозможно сделать его простым \s, так как мы не можем позволить взгляду переместить его в соответствие позиции шаблона, то есть мы не можем позволить ему попробовать \s-\s раньше и включить - (это приведет к true результат).

enter image description here

0 голосов
/ 01 декабря 2018

Чтобы игнорировать тире уже с пробелом до / после, вы можете использовать положительные обходные ограничения , чтобы утверждать, что слева и справа находятся символы без пробелов \S

При замене используйте пробел.

(?<=\S)-(?=\S)

Regex demo

...