Я хочу написать регулярное выражение, которое соответствует портам. Это прекрасно работает, но часто время тоже совпадает. Я хотел создать отрицательный просмотр вперед и просмотр назад, чтобы, если в строке есть другое двоеточие, оно не совпадало. Но я делаю ошибку и не могу ее заметить:
Я хочу, чтобы порты совпадали, но не совпадали по времени.
(?<!:):\d{1,5}\b(?!:)
Вот ссылка на сохраненное регулярное выражение.
Иногда порты отображаются так: 443 и :80 без информации IPv4. Вот почему я ищу решение для обхода. Я использую ECMAScript.
Вам это нужно только для IPv4?
ECMAScript, поэтому используется один javascript, да, только для IPv4. Но я забыл упомянуть, что порты иногда отображаются без IP-адресов. Мне придется отредактировать вопрос для этого.
:
- двоеточие, ;
- точка с запятой
Какую версию ECMAScript поддерживает разновидность регулярных выражений? Обратите внимание, что даже в реализациях JS разновидности регулярных выражений различаются (ср. Safari/Chrome).
@MarioJost Я только что обновил свой ответ, который обрабатывает пустой IP-адрес, все действительные адреса IPv4 и ограничивает порты допустимыми портами. Теперь у него есть пример ESMAScript. Соответствие регулярному выражению, только если двоеточие найдено.
@WiktorStribiżew Мой обновленный ответ работает в большинстве браузеров? Кажется, это сработало для меня при тестировании основных трех.
¹
^\d+\.\d+\.\d+\.\d+:\K\d{1,5}
Или
²
^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}:\K\d{1,5}
Предполагая, что ip's только ipv4
¹ Online Demo ² Online Demo
Это работает для вас?
Он работает в тестере регулярных выражений, но не работает в SecureCRT, где я пытаюсь это сделать. Кажется, что он не может обработать команду /K. Но спасибо за вашу помощь.
Если вас интересует что-либо после одиночного : в строке:
^[^:]*:(\d{1,5})$
И используйте группу 1 для вашего порта.
Если вы хотите быть немного более строгим и ограничить диапазон портов фактическим от 0 до 65535, вы можете использовать это:
^[^:]*:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{1,4})$
(для краткости ;-) я разрешил ведущие нули в этом регулярном выражении)
Ваше регулярное выражение отлично подходит в тестере. Также спасибо за проверку диапазонов портов, это приятная деталь. Но я не могу использовать группы в своем приложении, поэтому оно будет соответствовать только всей строке. Я действительно надеялся, что смогу избежать совпадения, если в строке более одной точки с запятой.
Невозможно будет сделать «не совпадение», если вы не хотите смотреть на всю строку. Может быть, вы можете использовать двухэтапный подход, когда вы сначала сопоставляете всю строку, а затем снова только номер порта?
Как вы упомянули Ecmascript, вот решение, которое соответствует номеру порта отдельно или как конечная часть IPv4:
const regex = /(?:\.\d+|\B)(?::)(\d{1,5})\b(?!:)/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?:\\.\\d+|\\B)(?::)(\\d{1,5})\\b(?!:)', 'g')
const str = `10.0.243.7:38518 :440
62.11.21.68:443 port :80
01:11:22
21:15:19
:443 `;
let m;
ports = Array.from(str.matchAll(regex), (m) => m[1])
console.info(ports)
Если вы используете Javascript и можете использовать просмотр назад переменной длины, вы можете утверждать : слева, но утверждать не ., за которым следуют цифры, а затем : слева:
(?<=:)(?<!:\d+:)\d{1,5}\b(?!:)
Демонстрация регулярных выражений
const regex = /(?<=:)(?<!:\d+:)\d{1,5}\b(?!:)/g;
const s = `10.0.243.7:38518
62.11.21.68:443
01:11:22
21:15:19`;
console.info(s.match(regex));
Если вы хотите также сопоставить двоеточие:
(?<!:\d+):\d{1,5}\b(?!:)
Демонстрация регулярных выражений
const regex = /(?<!:\d+):\d{1,5}\b(?!:)/g;
const s = `10.0.243.7:38518
62.11.21.68:443
01:11:22
21:15:19`;
console.info(s.match(regex));
Это именно то, что мне нужно, большое спасибо.
Я хочу написать регулярное выражение, которое соответствует портам. Забыл упомянуть, что порты иногда отображаются без IP.
Регулярное выражение ECMAScript:
^((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b)){4}|):(?<port>((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4})))$
ПКРЕ:
^((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b)){4}|):\K((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$
Это обрабатывает все случаи, включая порт, показанный без IP-адреса.
Посмотрите ECMAScript и PCRE в действии.
^
).\b
) не позволяет четвертому соответствовать шаблону .:
.\K
), чтобы игнорировать IPv4-адрес в совпадении в PCRE и использовать именованный захват в ESMAScript.$
).Пример Javascript:
const regex = /^((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b)){4}|):(?<port>((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4})))$/gm;
const input = `10.0.243.7:38518
62.11.21.68:443
01:11:22
21:15:19
10.20.30.40:2312
10.20..40:2312
10.20.40.:2312
10.20.40:5312
10.20.30.40:0
10.20.30.40:0;
:293
:65536
1.1.2.2:65536`;
for (const match of input.matchAll(regex)) {
console.info(`${match.groups.port}`);
}
Какой язык вы используете?