我使用正则表达式尝试匹配一个标签,在本例中为“业务单位:”,后跟一个或多个空格,然后将子匹配中的所有内容匹配到该行的末尾。当该行上的标签后面没有字符时,我遇到了问题,它抓住了下一行。
例如,这是一些测试数据:
Business Unit:(space)(space)BU1(space) This is Line 2 Business Unit:(space)(space) This is Line 4
所以我只想从第一行中抓取“ BU1”,并且行得通。它应该与第三行中的空字符串匹配,但与第四行的内容匹配,在这种情况下为“这是第4行”。
这是我的表情:
Business Unit:\s+(.+)
我以为圆点字符不是不是应该匹配换行符,但是看起来是这样。
在这种情况下正确的正则表达式是什么?
答案 0 :(得分:0)
这里的真正问题是\s+
是贪婪的,因此它将匹配所有空格(包括新行),因此它匹配直到下一行,然后.+
捕获其余的行。
This should meet your requirements。
模式为^Business Unit: *([\S]*)
这当然是假设您的业务部门不包含任何空格。如果可以,那么我可以修改模式。
答案 1 :(得分:0)
这取决于您使用正则表达式的上下文,因为多行处理可能会有所不同,但这是一个开始:
/^Business Unit: +([^ ]*) *$/
^
从行首开始,Business Unit:
+
后跟1个或多个空格,([^ ]*)
捕获任何可能的非空白内容,*$
,后跟空格,直到行尾。 同样,根据您的上下文,您可能需要将亚麻指定为\n
:
/^Business Unit: +([^ ]*) *\n/
答案 2 :(得分:0)
\n
字符是\s
的一部分。这就是为什么您在下一行找到匹配项的原因。
您可以这样做:
/^Business Unit:[ \t]*([^\n]*?)[ \t]*$/m
如果要排除前导水平空格,并且不匹配,则为空白:
/^Business Unit:[ \t]+(\S+)[ \t]*$/m
答案 3 :(得分:0)
将字符类减用于空格除换行符:
Business Unit:[\s&&[^\n]]*(\S*)
请参见live demo。
表达式[\s&&[^\n]]
是减法,则捕获是针对0个或多个非空白(您的目标)的。
答案 4 :(得分:0)
在您的示例中,您捕获了最后一行,因为\s也与换行符匹配。
您可以做的是将\s+
替换为空白,并在一个组中捕获零次或多次
.*
的任何字符
您可以在开头使用单词边界\b
。
更新
基于注释,为了不与行尾的空格匹配,您可以使用一次或多次匹配非空格字符\S+
,然后重复匹配空格或制表符{{1}的模式},然后将其设为非空白字符,并将该组设为可选的[ \t]