正则表达式中的星号

4

我正在尝试获取冒号后面的文本行部分。例如,从这段文本中:

previous usc contact name:*assistant director of field education*

agency name:*development corporation

我想获取以下内容:

assistant director of field education

1010 development corporation

我尝试了以下正则表达式。
.*:\*?(.*)\**$ 

它没有起作用。现在正在运行的是这个:
.*:\*?(.*)\*

我不明白为什么第二行没有星号也能够运行,并且正则表达式需要星号,而第一个正则表达式不能正常工作。

谢谢。


“不起作用”是什么意思?你使用的是哪种语言?当我在Python中尝试您的第一个正则表达式时,它可以工作 - 唯一的问题是“.”也匹配星号。你可以通过将其更改为“[^] *”来解决这个问题。 - happydave
1
当我测试第一行时,它不起作用,因为您在 "$" 之后有一个尾随空格字符 - 但是如果我将其去掉,它就可以正常工作了。您的工作代码末尾是否有空格?还是只有在这个页面上有? - TimHayes
1
  1. $ 默认表示字符串的结尾。如果你想匹配行末,可能需要使用 MULTILINE 标志。
  2. 确保正则表达式引擎能够识别转义字符。在源代码中的字符串字面量中尝试将它们加倍:'\\'
- jfs
1个回答

5
简而言之:
第二个正则表达式 .*:\*?(.*)\* 能够工作,因为: .* 匹配了前一个联系人姓名和机构名称,接着是 :\* (转义的 * 表示匹配星号)。
最后,(.*)\* 匹配一切直到最后一个星号。
(假设您在最后一行错过了星号,则会匹配以下内容:)
助理主管和开发公司。
第一个正则表达式失败的原因很难从给定的例子中推断出来。.*:\*?(.*)\**$ 的意思是,行尾必须是零个或多个星号(\**)。
假设您的换行符与提供的相同,它只会匹配开发公司,因为锚点 $(行尾)通常在单行模式下使用,表示“字符串结尾”。因此,正则表达式只能匹配一次。如果将修饰符改为多行模式(这意味着 $ 会匹配每个 \r\n 而不只是字符串结尾),则可以得到所需结果。
单行模式,匹配:
开发公司 .*:\*?(.*)\**$
正则表达式可视化
Debuggex 演示
多行模式匹配:
助理主管和开发公司。
开发公司 .*:\*?(.*)\**$
正则表达式可视化
Debuggex 演示
^$ 的行为取决于修饰符:
给定字符串:
Hello
World

在单行模式下使用^(.*)$将匹配Hello World。在多行模式下使用相同的模式将匹配两个不同的Matchgroup:HelloWorld

在单行模式下,字符串将由正则表达式引擎处理,如下所示:

^Hello
World$

在多行模式下,引擎将其线程化。
^Hello$
^World$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接