0

嗨,我正在尝试将字符串与模式匹配

这是可能的字符串

signal CS, NS, dl: stateType := writeOrRead0; 
signal CS, pS : stateType := writeOrRead0; 
signal dS : stateType := writeOrRead0; 

我只关心第一个冒号的模式。

但是定义的信号数量可能不止一个,也可能是三个或四个,即使这是我拥有的正则表达式

^signal\\s*(\\w+),*\\s*(\\w+)\\s*:

它会接收第二个信号,但是对于第二个信号,它会接收 CS 和 pS,但是当我使用下一个信号时,它会接收 d 和 S

matcher.group()

分别上来

谁能给我一个表达式,无论是一二三还是更多,都会选择所有信号名称?

4

3 回答 3

5

如果您想为每个信号名称设置一个组,那是不可能的(除非您有信号数量的上限,否则您可以写出整个内容,但这会非常难看)。

因此,您必须使用包含名称的一组,用逗号分隔。然后您可以对其进行后处理以获取真实的信号名称。

那会给出类似的东西

^signal\s+((?:\w+(?:,\s*)?)*)\s*:

(请注意,我没有将它作为 Java 字符串转义。)

第 1 组是你的名字。

于 2012-10-25T11:00:52.240 回答
4

我会做接下来的事情:

1- 获取完整的信号组:CS、NS、dl(例如)

2-解析它们

你的例子:

1-^signal\\s((\\w*)(?:,\\s)?)+

2- 现在你在一个像“CS,NS,dl”这样的组中有一个字符串,现在用一个简单的分割“,”你可以把它们放在一个数组中。

于 2012-10-25T11:00:43.327 回答
0

你可以使用这个正则表达式:

^信号\s([\w,\s]*(?=:))

以信号开头,后跟一个空格,捕获一个单词的零次或多次出现,后跟一个逗号和一个空格。在“:”处结束捕获,但不将其包含在匹配中。

为了不将信号本身包含在匹配中,您可以使用如下所示的lookbehind:

^(?<=信号)\s([\w,\s]*(?=:))

于 2012-10-25T11:00:59.550 回答