Regex: соответствует, но не в комментарии - PullRequest
8 голосов
/ 21 июля 2011

У меня есть файл полей данных, который может содержать комментарии, как показано ниже:

id, data, data, data
101 a, b, c
102 d, e, f
103 g, h, i // has to do with 101 a, b, c
104 j, k, l
//105 m, n, o
// 106 p, q, r

Как вы можете видеть в первом комментарии выше, есть прямые ссылки на соответствующий шаблон.Теперь я хочу захватить 103, и это три поля данных, но я не хочу фиксировать то, что в комментариях.

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

(?<!//)(\b\d+\b),\s(data),\s(data),\s(data)

Это будет захватывать все, кроме исключения 105, но указать

(?<!//\s*) or (?<!//.*)

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

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


Если это еще один случай "регулярные выражения не поддерживают рекурсию", потому что это обычный язык (теория автоматов), укажите это.

Можно ли исключить комментарии в 103, а также строки 105 и 106, используя регулярное выражение?Если да, то как?

Ответы [ 3 ]

6 голосов
/ 21 июля 2011

Самый простой выход - заменить \s*//.* пустой строкой перед началом.

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

Альтернативой может быть использование упреждения вместо оглядки назад:

^(?!//)(\b\d+\b),\s(data),\s(data),\s(data)

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

^(\b\d+\b),\s(data),\s(data),\s(data)

Некоторые движки регулярных выражений (например, в .NET) поддерживают поиск переменной длины.позади, кажется, ваши не способны на это, вот почему (?<!//\s*) терпит неудачу для вас.

1 голос
/ 21 июля 2011

Вы можете просто привязать регулярное выражение к началу строки:

(?m)^(\d+),\s(\S+),\s(\S+),\s(\S+)
1 голос
/ 21 июля 2011

Мне кажется, вы можете просто закрепить выражение в начале строки (чтобы получить все данные):

^(\d+),\s(data),\s(data),\s(data)\s*(?://|$)

Или, может быть, вы можете использовать правильный анализатор CSV, который может обрабатывать комментарии.

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