正则表达式:匹配除第一个字符串和#comment行之外的整行

时间:2011-05-06 23:58:54

标签: regex

我试过(\s|\t).*[\b\w*\s\b],这个几乎可以,但除了#。

之外我也想要
#Name                       Type       Allowable values                        
#========================== =========  ========================================
_absolute-path-base-uri     String     -                                       
add-xml-decl                Boolean    y/n, yes/no, t/f, true/false, 1/0       

5 个答案:

答案 0 :(得分:2)

正如@anubhava在他的回答中所说,看起来你只需要在行的开头检查#。正则表达式很简单,但应用正则表达式的机制变化很大,所以如果我们知道你正在使用哪种正则表达式风格/工具(例如PHP,.NET,Notepad ++,EditPad)会有所帮助临等)。这是一个JavaScript版本:

/^[^#].*$/mg

请注意修饰符:m(“多行”)允许^$在行边界匹配,g(“全局”)允许您查找所有比赛,而不仅仅是第一场比赛。

现在让我们来看看你的正则表达式。 [\b\w*\s\b]是一个匹配单词字符(\w),空白字符(\s),星号(*)或退格({{1}的字符类}})。换句话说,\b*在出现在角色类中时会失去特殊含义。

\b匹配任何包含\s的空白字符,因此\t不必要地冗余,根本不需要。它在你的情况下实际做的是在每个匹配的行之前匹配换行符。在多线模式下使用(\s|\t)时无需这样做。如果要在^之前允许水平空格(即空格和制表符),则可以执行以下操作:

#

/^(?![ \t]*#).*$/mg 是一个负面的预测;它意味着“从这个位置开始,不可能匹配零个或多个制表符或空格后跟(?![ \t]*#)”。在#线锚之后,“此位置”意味着线的开始。

答案 1 :(得分:0)

试试这个:

^[A-z0-9_-]+\s+(.+)$

假设您的第一个字符串仅包含字母,数字,下划线或连字符,则第一个字符串将匹配该字符串。然后我们匹配空格,然后捕获其余的空格。但是,这完全取决于正在使用的正则表达式引擎。这是使用语言支持正则表达式,特定编辑器还是某个库?哪一个?没有标准:每个正则表达式引擎的工作方式略有不同。

答案 2 :(得分:0)

试试这个:

^[^#].*?(\s|\t)(?<Group>.*)$

找到匹配后,Group组将包含您的字符串。

答案 3 :(得分:0)

我会使用这个正则表达式。在英语中,这表示“第一个字符不是井号(#),然后是非白色空格以匹配第一个'字',然后是空格,然后匹配整行。

^[^#]\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();
    }
}

答案 4 :(得分:0)

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

代码非常简单,它只是忽略了一行开头的匹配#,从而完全侵入了这些行。