正则表达式JAVA一次或多次

时间:2012-10-25 10:52:53

标签: java regex string pattern-matching

您好我正在尝试将字符串与模式匹配

这是可能的字符串

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()

单独出现

任何人都可以给我一个表达式来获取所有信号名称,无论是否有两个或更多?

3 个答案:

答案 0 :(得分:5)

如果你想为每个信号名称设一个组,那是不可能的(除非你有一个信号数量的上限,那么你可以写出整个事情,但它会非常难看)。

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

这会产生类似

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

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

第1组是你的名字。

答案 1 :(得分:4)

我会做下一件事:

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

2-解析他们

你的例子:

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

2-现在你在像“CS,NS,dl”这样的组中有一个字符串,现在只需要分成“,”就可以将它们放在一个数组中。

答案 2 :(得分:0)

您可以使用此正则表达式:

  

^信号\ S([\ W,\ S] *(=?))

以信号后跟空格开始,捕获零个或多个单词出现后跟逗号和空格。结束捕获':'但不包括在比赛中。

为了不在比赛中包含信号本身,你可以使用一个lookbehind如下:

  (?&LT =信号)

^ \ S(?[\ W,\ S] *(=:))