RegEx для захвата числовых паттернов, за которыми не следуют другие символы - PullRequest
2 голосов
/ 15 мая 2019

Я использую C # и хочу захватить IP:PORT с помощью регулярных выражений, но как сделать так, чтобы он не совпадал, если после PORT символ :?

проверить это здесь

Шаблон:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?!:)

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

1.22.234.255:8181:u:p // true, it should be false
   1.22.234.255:80 // true
  1.22.234.255    8080 // true
 dddd1.22.234.255       80808 // true

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Проблема в том, что выражение вашего порта (\d{2,5}) не захватывает все цифры.В неожиданно передаваемом выражении, если вы посмотрите на группы совпадений, это 1.22.234.255 и 818 (, а не 8181).Выражение отклоняет 1.22.234.255:8181, потому что за ним следует :, но затем он рассматривает трехзначный порт и принимает 1.22.234.255:818, потому что следующий символ - 1, а не :.

Один из способов компенсировать это - изменить свой шаблон, отклоняя двоеточия и цифры:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?![0-9:])
1 голос
/ 15 мая 2019

Это регулярное выражение работает для всех случаев

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*(?::\s*)?(?<!\d)(\d{2,5})(?!\d|\s*:)

https://regex101.com/r/5faUcx/1

Читаемая версия

 (                             # (1 start), IP
      \d{1,3} \.
      \d{1,3} \.
      \d{1,3} \.
      \d{1,3} 
 )                             # (1 end)

 \s* 
 (?: : \s* )?
 (?<! \d )

 ( \d{2,5} )                   # (2), Port
 (?! \d | \s* : )
0 голосов
/ 15 мая 2019

Попробуйте использовать два разных регулярных выражения, это будет проще

Выражение 1 для пробелов:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{2,5})

Выражение 2 без пробелов, вы должны убедиться, что в нем есть символ EOL или модификатор / m, если у вас несколько строк:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:(\d{2,5})$

Сопоставьте с любым из двух и объедините результаты.

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