Регулярное выражение, которое соответствует фрагменту фиксированной длины с элементами переменной длины - PullRequest
4 голосов
/ 24 января 2012

Я пишу несколько регулярных выражений для соответствия строкам, которые содержат числовые элементы, дополненные пробелами, например -2.45. Регулярное выражение для этого достаточно просто:

/(\s*-?\d+\.\d{2})/

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

/(\s{0,3}-?\d{1,4}\.\d{2})/

Но это не решение, так как \s{0,3} совпадает независимо от \d{1,4}, так что все это может соответствовать фрагменту в любом месте от четырех до одиннадцати символов.

Есть ли способ, которым я могу ограничить целую группу подобной фиксированной длиной?

Edit:

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

/^(fixed length stuff at start of line)(7 char chunk)\s{3}(2nd 7 char chunk)\s{3}(3rd 7 char chunk)$/

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

1 Ответ

4 голосов
/ 24 января 2012

Вы можете использовать прогнозное утверждение (и вам не нужны скобки):

/(?=[\s\d-]{4}\.\d{2})\s*-?\d+\.\d{2}/

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

/(?=[\s\d-]{4}\.\d{2}\b)\s*-?\d+\.\d{2}\b/

, чтобы убедиться, что число действительно заканчивается после \.d{2} части.

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