Regex 用于匹配过去标签(包括空字符串)的正则表达式

Regex 用于匹配过去标签(包括空字符串)的正则表达式,regex,Regex,使用正则表达式,我试图匹配一个标签,在本例中为“Business Unit:”,后跟一个或多个空格,然后将子匹配中的所有内容匹配到该行的末尾。我遇到了一个问题,当行上的标签后面没有字符时,它会抓住下一行 例如,以下是一些测试数据: Business Unit:(space)(space)BU1(space) This is Line 2 Business Unit:(space)(space) This is Line 4 业务单位:(空间)(空间)BU1(空间) 这是2号线 业务单位:(空间)

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

例如,以下是一些测试数据:

Business Unit:(space)(space)BU1(space) This is Line 2 Business Unit:(space)(space) This is Line 4 业务单位:(空间)(空间)BU1(空间) 这是2号线 业务单位:(空间)(空间) 这是四号线 所以我只想从第一行抓取“BU1”,这样就行了。它应该匹配第三行中的空字符串,但它与第四行的内容匹配,在本例中为“this is line 4”

以下是我的表达:

Business Unit:\s+(.+) 业务单位:\s+(.+) 我认为点字符不应该与换行符匹配,但它似乎是匹配的


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

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

模式为
^业务单元:*([\S]*)


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

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

/^Business Unit: +([^ ]*) *$/
  • ^
    从行首开始
  • 匹配文字,
    业务单位:
  • +
    后跟一个或多个空格
  • ([^]*)
    捕获任何可能的非空白内容
  • *$
    后跟空格,直到行尾 同样,根据您的上下文,您可能需要将行号指定为
    \n

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

    \n
    字符是
    \s
    的一部分。这就是为什么你会在下面这一行找到一个匹配项

    你可以做:

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

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

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

    对除换行符以外的空白使用字符类减法:

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


    表达式
    [\s&&[^\n]]
    是减法运算,然后捕获0个或更多非空格(您的目标)。

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

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

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

    更新

    根据注释,要在行尾不匹配空格,可以使用匹配一个或多个非空格字符
    \S+
    ,然后使用重复模式匹配空格或制表符
    [\t]
    和一个或多个非空格字符,并使组成为可选的


    啊,我以为\s只匹配了一个空格或制表符。在给出后续答案后,我现在有了以下表达式:Business Unit:[\t]*(.*)[\t]*但是.*正在获取尾随空格,我想消除它。我该怎么做?请注意,要匹配的值可以具有嵌入空格(以及特殊字符)。例如,“Central System(CS)”。@JoeA您是说like,它使用
    \S
    匹配非空白字符,后跟一个匹配空白字符的重复模式,还是一个后跟非空白字符的制表符,以便在结尾不匹配空白字符。太好了!谢谢。@JoeA不客气。我补充了这一点,作为对我答案的更新。