#regex
#регулярное выражение
Вопрос:
Я пробовал (s|t).*[bw*sb]
, это почти нормально, но я хочу также, кроме строк с #.
#Name Type Allowable values
#========================== ========= ========================================
_absolute-path-base-uri String -
add-xml-decl Boolean y/n, yes/no, t/f, true/false, 1/0
Ответ №1:
Как сказал @anubhava в своем ответе, похоже, вам просто нужно проверить #
в начале строки. Регулярное выражение для этого простое, но механизм применения регулярного выражения сильно различается, поэтому было бы полезно, если бы мы знали, какой вариант / инструмент регулярного выражения вы используете (например, PHP, .NET, Notepad , EditPad Pro и т.д.). Вот версия JavaScript:
/^[^#].*$/mg
Обратите внимание на модификаторы: m
(«многострочный») позволяет ^
и $
сопоставлять границы строк, а g
(«глобальный») позволяет находить все совпадения, а не только первое.
Теперь давайте посмотрим на ваше регулярное выражение. [bw*sb]
это символьный класс, который соответствует символу слова ( w
), символу пробела ( s
), звездочке ( *
) или пробелу ( b
). Другими словами, оба *
и b
теряют свои особые значения, когда появляются в классе символов.
s
соответствует любому символу пробела, включая t
, поэтому (s|t)
является излишне избыточным и может вообще не понадобиться. Что это на самом деле делает в вашем случае, так это сопоставление новой строки перед каждой сопоставленной строкой. В этом нет необходимости, когда вы можете использовать ^
в многострочном режиме. Если вы хотите разрешить горизонтальные пробелы (т. е. пробелы и табуляции) перед #
, вы можете сделать это:
/^(?![ t]*#).*$/mg
(?![ t]*#)
это отрицательный прогноз; это означает «с этой позиции невозможно сопоставить ноль или более табуляций или пробелов, за которыми следует #
«. Идущая сразу после ^
привязки строки, как это и происходит, «эта позиция» означает начало строки.
Комментарии:
1. Я использовал TextMate (Mac) или RegExhibit (Mac).
Ответ №2:
Попробуйте это:
^[A-z0-9_-] s (. )$
Предполагая, что ваша первая строка будет состоять только из букв, цифр, подчеркиваний или дефисов, первая часть будет соответствовать этому. Затем мы сопоставляем пробелы, а затем фиксируем остальное. Однако все это зависит от используемого механизма регулярных выражений. Используется ли при этом языковая поддержка регулярных выражений, определенного редактора или определенной библиотеки? Какую? Стандарта не существует: каждый механизм регулярных выражений работает немного по-разному.
Комментарии:
1. Библиотека регулярных выражений Oniguruma от K. Kosako. geocities.jp/kosako3/oniguruma/doc/RE.txt
Ответ №3:
Попробуйте это:
^[^#].*?(s|t)(?<Group>.*)$
После того, как совпадение будет найдено, Group
группа будет содержать вашу строку.
Комментарии:
1. Почти.
(s|t).*[w*s]|^[^#].*!((s|t).*)
но это также соответствует равенству после пробела.
Ответ №4:
Я бы использовал это регулярное выражение. На английском языке это говорит о том, что «Первый символ не является знаком фунта (#), затем не является пробелом, чтобы соответствовать первому слову «, затем пробел, затем соответствует всей строке.
^[^#]S*s (. )$
Могу ли я предложить другой подход? Похоже, что между каждым полем в тексте есть табуляции, так почему бы просто не прочитать текст построчно и не разбить по табуляциям в массив?
Вот пример на C # (непроверенный):
using(StreamReader sr = new StreamReader("C:\Path\to\file.txt"))
{
string line = sr.ReadLine();
while(!sr.EndOfStream)
{
//skip the comment lines
if(line.StartsWith("#"))
continue;
string[] fields = line.Split(new string[] {"t"}, StringSplitOptions.RemoveEmptyEntries);
//now fields[0] contains the Name field
//fields[1] contains the Type field
//fields[2] contains the Allowable Values field
line = sr.ReadLine();
}
}
Ответ №5:
Попробуйте этот код на php:
<?php
$s="#Name Type Allowable values
#========================== ========= ========================================
_absolute-path-base-uri String -
add-xml-decl Boolean y/n, yes/no, t/f, true/false, 1/0 ";
$a = explode("n", $s);
foreach($a as $str) {
preg_match('~^[^#].*$~', $str, $m);
var_dump($m);
}
?>
ВЫВОД
array(0) {
}
array(0) {
}
array(1) {
[0]=>
string(79) "_absolute-path-base-uri String - "
}
array(1) {
[0]=>
string(77) "add-xml-decl Boolean y/n, yes/no, t/f, true/false, 1/0 "
}
Код довольно прост, он просто игнорирует совпадение #
в начале строки, тем самым полностью заполняя эти строки.