Как заменить все вхождения символа, если он не включен в слово с помощью регулярных выражений - PullRequest
3 голосов
/ 26 апреля 2019

Я пытаюсь заменить все вхождения символов «m» или «M» словом «метры», если оно не является частью какого-либо слова, такого как «from», с помощью регулярных выражений.

Регулярное выражениеЯ пришел к выводу, что это наиболее близко соответствует тому, что я хотел бы:

\(?=\D)(m|M)(?=\W)/g\

Однако это по-прежнему соответствует «м» в слове «от», а также «м» в «15 м»"или" 15 м "

Ожидаемый результат:

15M -> 15 meters
15m -> 15 meters
15 M -> 15 meters
15 m -> 15 meters
15 M and other words -> 15 meters and other words
15 m and the word from -> 15 meters and the word from
ADM -> ADM
ADM 15m adm 15 M AdM -> ADM 15 meters adm 15 meters AdM
1.5m -> 1.5 meters
45mm -> 45mm

Как сделать так, чтобы регулярное выражение выбиралось только" m ", если ему НЕ предшествует символ.Все ответы / помощь очень важны.

РЕДАКТИРОВАТЬ: Извините за то, что не прояснил пару вещей: я редактирую ожидаемый выходной раздел вопроса, чтобы показать, что замена будет делать с помощью регулярного выражения.Также регулярное выражение предназначалось только для символа «m» и игнорировало остальную часть слова или числа, частью которого он является.Например, 15 м станет 15 м после замены с использованием регулярного выражения.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Вы соответствуете m в слове from, потому что эта часть (?=\D)(m|M) использует положительный прогноз, который утверждает, что то, что справа, не является цифрой, а затем соответствует m.o в from действительно не цифра, поэтому есть совпадение.

Вместо чередования вы также можете использовать класс символов [mM] или использовать флаг без учета регистра /i, просто используйтем.

((?:^|\s+)\d+\s*)m(?!\S)
  • ( Группа захвата
    • (?:^|\s+) Утверждение начала строки или совпадение 1+ пробельных символов
    • \d+\s* Соответствие1+ цифр, за которыми следуют 0+ пробелов
  • )m Закрыть группу захвата и сопоставить m
  • (?!\S) Отрицательный взгляд вперед, утверждать, что справа нетнепробельный символ

Regex demo

let pattern = /((?:^|\s+)\d+\s*)m(?!\S)/gi;
[
  "15M",
  "15m",
  "15 M",
  "15 m",
  "15 M",
  "15 m and the word from",
  "15 M and other words with 15 meter and 9m is 999mtest",
  "test200m",
].forEach(s => console.log(s.replace(pattern, "$1meter")))
1 голос
/ 26 апреля 2019

Дайте этому шанс

/(?<!\D\w)(m|M)(?=\s)/g
0 голосов
/ 26 апреля 2019

Этот RegEx может помочь захватить M и m , и вы можете просто вызвать их, используя $ 2 , что является вторымgroup:

^([0-9\s]+)(m|M)

Ключ к этому методу - не ограничивать его справа, а ограничивать только слева.

enter image description here

...