Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:匹配除第一个字符串和#注释行之外的整行_Regex - Fatal编程技术网

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

Regex 正则表达式:匹配除第一个字符串和#注释行之外的整行,regex,Regex,我尝试了(\s |\t)。*[\b\w*\s\b],这一个几乎可以,但我也想要带#的行 试试这个: ^[A-z0-9_-]+\s+(.+)$ ^[^#].*?(\s|\t)(?<Group>.*)$ 假设第一个字符串仅由字母、数字、下划线或连字符组成,则第一部分将与之匹配。然后我们匹配空白,然后捕获其余的。但是,这完全取决于所使用的正则表达式引擎。这是使用对正则表达式、特定编辑器或特定库的语言支持吗?哪一个?没有一个标准:每个正则表达式引擎的工作方式略有不同。试试这个: ^[A-

我尝试了
(\s |\t)。*[\b\w*\s\b]
,这一个几乎可以,但我也想要带#的行

试试这个:

^[A-z0-9_-]+\s+(.+)$
^[^#].*?(\s|\t)(?<Group>.*)$
假设第一个字符串仅由字母、数字、下划线或连字符组成,则第一部分将与之匹配。然后我们匹配空白,然后捕获其余的。但是,这完全取决于所使用的正则表达式引擎。这是使用对正则表达式、特定编辑器或特定库的语言支持吗?哪一个?没有一个标准:每个正则表达式引擎的工作方式略有不同。

试试这个:

^[A-z0-9_-]+\s+(.+)$
^[^#].*?(\s|\t)(?<Group>.*)$
^[^#].*(\s|\t)(?*)$

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

我将使用此正则表达式。在英语中,这表示“第一个字符不是磅符号(#),然后是非空格以匹配第一个“单词”,然后是空格,然后匹配整行

^[^#]\S*\S+(.+)$

不过,我可以建议另一种方法吗?看起来文本中的每个字段之间都有制表符,所以为什么不逐行读取文本并按制表符拆分成一个数组呢

以下是C#中的一个示例(未经测试):

在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);
}
?>

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

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

/^[^#].*$/mg
注意修饰符:
m
(“多行”)允许
^
$
在行边界处匹配,而
g
(“全局”)允许查找所有匹配项,而不仅仅是第一个

现在让我们看看您的正则表达式。
[\b\w*\s\b]
是一个字符类,它与单词字符(
\w
)、空白字符(
\s
)、星号(
*
)或退格(
\b
)匹配换句话说,当字符出现在字符类中时,
*
\b
都失去了它们的特殊含义

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

/^(?![ \t]*#).*$/mg

(?![\t]*#)
是一种消极的前瞻;它意味着“从这个位置,不可能匹配零个或多个制表符或空格,后跟
”。就在
^
行锚之后,“这个位置”意味着一行的开始。

我使用了TextMate(Mac)或RegExhibit(Mac).Oniguruma正则表达式库,由K.Kosako.small.
(\s |\t)。*[\w*\s]^[^#].*!(\s |\t)。*
,但此表达式也匹配空格后的相等值。
/^(?![ \t]*#).*$/mg