Использование границ слова, когда слово соседствует с числом - PullRequest
1 голос
/ 08 ноября 2019

Я крайне неопытен в регулярных выражениях, поэтому, пожалуйста, потерпите меня. Моя программа проверяет единицы измерения на входе пользователя и преобразует их из метрических в британские или наоборот. Вот фрагмент моего заявления о ситуации:

when /ltr|ltrs|liter|liters|litre|litres/
      puts "#{int} liter(s) is equal to #{calc(int, 3.78541)} gallon(s), #{rem(int, 3.78541, 4)} quart(s)!"
when /gal|gals|gallon|gallons/
      puts "#{int} gallon(s) is equal to #{calc(int, 0.264172)} liter(s), #{rem(int, 0.264172, 1000)} milliliter(s)!"

Я хотел бы изменить первый when, чтобы он также включал /l/. Чтобы предотвратить его смешивание с присутствующим l в других when условиях (как в gallon), я хотел использовать что-то вроде /\bl\b/. Проблема в том, что это делает программу неспособной распознать l, если она находится рядом с числом, как, например, в 20L. Есть ли способ сделать границу слова, которая игнорирует соседние числа?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Поскольку левая граница слова также может быть записана как (?<!\w), а правая граница может быть записана как (?!\w), все, что вам нужно сделать, это вычесть из нее \d.

Youможет использовать его либо

(?<![^\W\d])L(?![^\W\d])

, либо с пересечением класса символов :

(?<![\w&&[^\d]])L(?![\w&&[^\d]])

И регулярное выражение будет выглядетькак /(?<![^\W\d])(?:<your_regex>)(?![^\W\d])/i:

/(?<![^\W\d])l(?:trs?|it(?:er|re)s?)?(?![^\W\d])/i
/(?<![\w&&[^\d]])l(?:trs?|it(?:er|re)s?)?(?![\w&&[^\d]])/i

См. демонстрационный пример регулярных выражений # 1 и демонстрационный пример регулярных выражений # 2 .

Подробности

  • (?<![^\W\d]) / (?<![\w&&[^\d]]) - прямо перед этим не может быть другого символа, кроме символов, не состоящих из слов или цифр (начальная граница слова с \d исключена)
  • l - l буква
  • (?:trs?|it(?:er|re)s?)? - необязательная последовательность:
    • trs? - tr или trs
    • | - или
    • it(?:er|re)s? - it, затем er или re, а затем необязательный s
  • (?![^\W\d]) / (?![\w&&[^\d]]) - сразу после этого не может быть другого символа, кроме символов, не состоящих из слов или цифр (завершающийграница границы с \d исключена)

Флаг i сделает регулярное выражение нечувствительным к регистру.

1 голос
/ 08 ноября 2019

(?<=\d|\b)L(?=\d|\b)

Вы можете использовать положительные обходные пути, чтобы утверждать, что непосредственно за буквой L находится либо граница слова, либо цифра.

  • (?<=\d|\b) Утверждение, что непосредственно перед шаблоном есть цифра или граница слова.
  • L Соответствует L.
  • (?=\d|\b) Утверждайте, что непосредственно после шаблона есть граница цифры или слова.

Используя обходные пути, вы можете утверждать о существовании чего-либо, не сопоставляя его. Это позволяет вам проверять наличие цифр без фактического использования их в регулярном выражении.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...