2014-09-25 3 views
0

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

Это выглядит следующим образом:

"^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)(?<!)" 

Большую часть времени он работает просто отлично, как на примере здесь: regex example 1

Однако, когда он встречает линию, которая имеет символ табуляции в любом месте между имя переменной и знак равенства, выражение не работает в соответствии с примером здесь: regex example 2

Я попытался заменить «\ s» на «\ t» и «\ x09», и он все еще не работает. Я редактировал текстовый файл, содержащий символ табуляции с шестнадцатеричным редактором, и подтвердил, что это действительно ASCII «09». Я не хочу использовать положительное совпадение символов, так как переменная может содержать довольно большое количество специальных символов.

Внешний вид буквального «=», кажется, вызывает проблему, но я не могу понять, почему. Например, если я отменил это выражение так: regex example 3

и использовать в нем строку с символом табуляции, она отлично работает. Но как только я добавляю литерал «=» в соответствии с примером здесь: regex example 4, он больше не совпадает, и он игнорирует символ табуляции.

ответ

1

Два [ ]* соответствуют только пробелам (U+0020 ПРОБЕЛ), а не другие пробельные символы. Измените оба на [ \t]*, чтобы соответствовать табуляции. Результат будет выглядеть так:

"^([^=\s]+)[ \t]*=[ \t]*([^;\r\n]+)(?<!)" 
+0

что установил его, но для чего-то другого я пытался "^ ([^ \ S] +) =" в первой части, и он не работает. Я думал, что «^ ([^ \ s] +) =« означает »с начала строки, соответствует всему, что не является пробелом, пока вы не дойдете до буквального« = »? – Lembasts

+0

@Lembasts '^ ([^ \ s] +) =' это не будет работать coz до '=' есть 'space'. Таким образом, нет ничего, чтобы потреблять пространство, поскольку вы отрицали потребление пространства. Поэтому он не будет работать. – vks

0

Вы только что добавил \t символ табуляции в той части, я думаю.

Это ваш пример 2 (не работает):

^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)(?<!) 

Это ваш пример 2 ... работает (с язычком):

^([^=\s]+)[ \t]*=[ ]*([^;\r\n]+)(?<!) 
      ^^ tab here 

Кажется, сделать трюк и матч ваш первый пример: http://regex101.com/r/kQ1zH4/1

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