Регулярное выражение: сопоставьте всю строку, кроме первой строки и строк #comment

#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     "
}
  

Код довольно прост, он просто игнорирует совпадение # в начале строки, тем самым полностью заполняя эти строки.