正则表达式匹配过去的标签,包括空字符串

时间:2018-07-30 23:09:45

标签: regex

我使用正则表达式尝试匹配一个标签,在本例中为“业务单位:”,后跟一个或多个空格,然后将子匹配中的所有内容匹配到该行的末尾。当该行上的标签后面没有字符时,我遇到了问题,它抓住了下一行。

例如,这是一些测试数据:

Business Unit:(space)(space)BU1(space)
This is Line 2
Business Unit:(space)(space)
This is Line 4

所以我只想从第一行中抓取“ BU1”,并且行得通。它应该与第三行中的空字符串匹配,但与第四行的内容匹配,在这种情况下为“这是第4行”。

这是我的表情:

Business Unit:\s+(.+)

我以为圆点字符不是不是应该匹配换行符,但是看起来是这样。

在这种情况下正确的正则表达式是什么?

5 个答案:

答案 0 :(得分:0)

这里的真正问题是\s+是贪婪的,因此它将匹配所有空格(包括新行),因此它匹配直到下一行,然后.+捕获其余的行。

This should meet your requirements

模式为^Business Unit: *([\S]*)

这当然是假设您的业务部门不包含任何空格。如果可以,那么我可以修改模式。

答案 1 :(得分:0)

这取决于您使用正则表达式的上下文,因为多行处理可能会有所不同,但这是一个开始:

/^Business Unit: +([^ ]*) *$/
  1. ^从行首开始,
  2. 匹配文字Business Unit:
  3. +后跟1个或多个空格,
  4. ([^ ]*)捕获任何可能的非空白内容,
  5. *$,后跟空格,直到行尾。

同样,根据您的上下文,您可能需要将亚麻指定为\n

/^Business Unit: +([^ ]*) *\n/

答案 2 :(得分:0)

\n字符是\s的一部分。这就是为什么您在下一行找到匹配项的原因。

您可以这样做:

/^Business Unit:[ \t]*([^\n]*?)[ \t]*$/m

Demo

如果要排除前导水平空格,并且不匹配,则为空白:

/^Business Unit:[ \t]+(\S+)[ \t]*$/m

Demo

答案 3 :(得分:0)

将字符类用于空格换行符:

Business Unit:[\s&&[^\n]]*(\S*)

请参见live demo

表达式[\s&&[^\n]]是减法,则捕获是针对0个或多个非空白(您的目标)的。

答案 4 :(得分:0)

在您的示例中,您捕获了最后一行,因为\s也与换行符匹配。

您可以做的是将\s+替换为空白,并在一个组中捕获零次或多次.*的任何字符

您可以在开头使用单词边界\b

\bBusiness Unit: +(.*)

更新

基于注释,为了不与行尾的空格匹配,您可以使用一次或多次匹配非空格字符\S+,然后重复匹配空格或制表符{{1}的模式},然后将其设为非空白字符,并将该组设为可选的[ \t]

\bBusiness Unit: +(\S+(?:[ \t]\S+)*)?