Нужно проверить "\\" (обратный слеш) в этом Reg Ex - PullRequest
0 голосов
/ 10 декабря 2008

В настоящее время я использую этот регистр, например:

"\bI([ ]{1,2})([a-zA-Z]|\d){2,13}\b"

Мне просто стало известно, что текст, против которого я его использую, может содержать "\" (обратный слеш) Как мне добавить это к выражению?

Ответы [ 4 ]

2 голосов
/ 10 декабря 2008

Добавить |\\ внутри группы, после \d, например.

1 голос
/ 10 декабря 2008

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

([a-zA-Z]|\d){2,13}

в это ...

([\w]{2,13})

и вы также можете добавить тест для символа обратной косой черты с помощью этого ...

([\w\x5c]{2,13})

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

"\bI([\x20]{1,2})([\w\x5c]{2,13})\b"

Смотри также:

0 голосов
/ 10 декабря 2008

Как я указал в своем комментарии к сообщению slavy, \\ -> \b в качестве обратной косой черты не является символом слова. Итак, мое предложение

/\bI([ ]{1,2})([\p{IsAlnum}\\]{2,13})(?:[^\w\\]|$)/ 

Я предположил, что вы хотите захватить целых 2-13 символов, а не только первый, который применяется, поэтому я настроил свой RE.

Вы можете сделать последний захват lookahead , если движок его поддерживает и вы не хотите его использовать. Это будет выглядеть так:

/\bI([ ]{1,2})([\p{IsAlnum}\\]{2,13})(?=[^\w\\]|$)/ 
0 голосов
/ 10 декабря 2008

И @ slavy13, и @dreftymac дают вам базовое решение с указателями, но ...

  • Вы можете использовать \d внутри класса символов для обозначения цифры.
  • Вам не нужно ставить пробел в класс символов, чтобы соответствовать его (за исключением, возможно, для ясности, хотя это спорно).
  • Вы можете использовать [:alpha:] внутри класса символов для обозначения буквенного символа, [:digit:] для обозначения цифры и [:alnum:] для обозначения буквенно-цифровых символов (особенно без подчеркивания, в отличие от \w). Обратите внимание, что эти классы символов могут означать больше символов, чем вы ожидаете; Вспомните акцентированные символы и неарабские цифры, особенно в Unicode.
  • Если вы хотите получить всю информацию после пробела, вам нужно повторить ее в скобках.

Сравните поведение этих двух однострочников:

perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]){2,13}\b/'

perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]{2,13})\b/'

Учитывая строку ввода "I a123", первая печатает "3", а вторая печатает "a123". Очевидно, что если вам нужен только последний символ второй части строки, то с исходным выражением все в порядке. Однако это вряд ли будет требованием. (Очевидно, что если вас интересует только вся партия, то использование '$&' даст вам соответствующий текст, но это отрицательно скажется на эффективности.)

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

m/\bI( {1,2})([[:alnum:]\\]{2,13})\b/

Время для обязательного штекера: прочитайте Джеффа Фридла " Освоение регулярных выражений ".

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