2015-03-24 4 views
1

У меня есть строка, которая поступает от пользовательского ввода через систему обмена сообщениями, это может содержать серию из четырехзначных чисел, но поскольку пользователи, вероятно, ошибочно вводят вещи, это должно быть немного гибкий. Поэтому я хочу, чтобы позволить им ввести число, или перцовый их сообщение с любой последовательностью символов, а затем просто взять числа, соответствующие форматыРегулярное выражение нахождение пробелов в номерах

=nnnn or nnnn 

Для этого у меня есть регулярное выражение:

(^|=|\s)\d{4}(\s|$) 

который почти работает, однако, как говорится, что каждая группа из 4-х цифр, должен начинаться с =, пробел, или в начале строки она пропускает любой другой набор чисел

Я попытался это:

(^|=|\s*)\d{4}(\s|$) 

Но это означает, что любые четыре цифры, за которыми следует пробел, совпадают - это неверно.

Как я могу соответствовать группы чисел, но включают в себя единое пространство в конце одной группы, и в начале следующего, чтобы уточнить эту строку:

Ack 9876 3456 3467 4578 4567 

должны производить матчи:

9876 
3456 
3467 
4578 
4567 
+0

вам нужно использовать утверждения '? (:^| [= \ S]) \ K \ d {4} (= \ s | $) ' –

+1

Какой язык/библиотека регулярных выражений? – Qix

+0

Это был C#, хотя я, хотя этот RegEx был (в значительной степени) языком агностиком - не так ли? – Morvael

ответ

2

Здесь вы должны использовать образы, которые не будут потреблять никаких символов.

(?:^|[=\s])\K\d{4}(?=\s|$) 

ИЛИ

(?:^|[=\s])(\d{4})(?=\s|$) 

DEMO

Ваше регулярное выражение (^|=|\s)\d{4}(\s|$) терпит неудачу, потому что на первых порах это будет соответствовать <space>9876<space> то будет искать другое пространство или равно или начало строки. Итак, теперь он находит следующий матч на <space>3467<space>. Он не будет соответствовать 3456, потому что пространство перед 3456 уже было использовано в первом матче. Чтобы сделать совпадающие совпадения, вам нужно поместить шаблон в позитивные образы. Поэтому, когда вы помещаете последний шаблон (\s|$) внутри lookahead, он не будет потреблять пространство, он просто утверждает, что за совпадением должно следовать пробел или конец границы строки.

+2

Пожалуйста, объясните, почему это работает, для таких людей, как я, которые хотят понять регулярные выражения, которые они слепо копируют/вставляют. –

+0

ok, всего лишь мин .. –

+1

Отмечено как ответ на объяснение, которое я понимаю, но я все еще нахожу RegEx рядом с невозможным для чтения, но я над этим работаю. – Morvael

0
\b\d+\b 

\b утверждает положение на границе слова (^\w|\w$|\W\w|\w\W). Это анкер 0-ширины, очень похожий на ^ и $. Он не потребляет никаких символов.

Demo

или

(?:^|(?<=[=\s]))\d{4}\b 

Demo

+1

Кто-то не читал весь пост! 'Поэтому я хочу разрешить им вводить числа или переполнять их сообщение любой строкой символов, а затем просто брать числа, соответствующие форматам' – Qix

Смежные вопросы