Java 捕获组仅返回每个组的最后一次出现
我有这样的字符串:Java 捕获组仅返回每个组的最后一次出现,java,regex,regex-group,Java,Regex,Regex Group,我有这样的字符串: String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3"; String s2 = "word3=PS2,p7,p8=q4,q5,q6|=PS3,p9="; String s3 = "=PS3="; 或者像这样: String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3"; String s2 = "word3=PS2,p7,p8=q4,q5,q6|=
String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3";
String s2 = "word3=PS2,p7,p8=q4,q5,q6|=PS3,p9=";
String s3 = "=PS3=";
或者像这样:
String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3";
String s2 = "word3=PS2,p7,p8=q4,q5,q6|=PS3,p9=";
String s3 = "=PS3=";
或者像这样:
String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3";
String s2 = "word3=PS2,p7,p8=q4,q5,q6|=PS3,p9=";
String s3 = "=PS3=";
所以,在形式上,字符串包含字典中的一些单词定义,由“|”符号分隔
在这里:
- 单词-字典中的单词(可选,如S2或S3)
- PS1、PS2、PS3-词性标签(必需)
- p1,p2,…-一些参数(可选)
- 第一季度、第二季度、第三季度其他一些参数(也是可选的)
- 第1组-单词
- 组2-词性标记
- 第三组,第四组,…-参数p
- 组(k),组(k+1),…-其他参数(q)
"([a-z]*)?=([A-Z]+)(,?[a-z]+)*=(,?[a-z]+)*")
但它不能正常工作。它只显示最后的参数p和q。即(对于S2):
- group1=word3-正常
- 组2=PS2-正常
- 组3=p8-不正常(仅最后一个p参数)
- 组4=q6-不正常(也是最后一个q参数)
String s = "bread=NOUN,plur,link=form|=VERB="
当我遇到这样的问题时,我会查看量词上的修饰词。您可能希望某些量词被修改为贪婪的,例如 (,?[a-z]+)+*
上面的区别在于,最后的零或更多量词现在尽可能地抓住了。这只是一个例子,我完全不确定那个特定的修饰符是否是您所需要的,但是,考虑到您的表达式按照您报告的方式工作,这些修饰符很可能会在剩下的过程中得到它。当我遇到这样的问题时,我会查看量词上的修饰符。您可能希望某些量词被修改为贪婪的,例如 (,?[a-z]+)+*
上面的区别在于,最后的零或更多量词现在尽可能地抓住了。这只是一个例子,我不确定这个特定的修饰符是否是您所需要的,但是,考虑到您的表达式是按照您报告的方式工作的,这些修饰符很可能会在接下来的过程中得到它。在正则表达式中不能有数量可变的捕获组。在.Net中,每个组可以有多个捕获,但在Java中不能。您的问题是,正则表达式引擎只存储每个组的最后一次成功匹配。你能做的最好的事情就是把所有的p和q参数匹配成两大组,然后把它们分开
Pattern pattern1 = Pattern.compile(
"([^|=,]*)" + // Group 1: The word. Zero or more characters.
"=([^|=,]*)" + // Group 2: The part of speech.
",?([^|=,]*(?:,[^|=,]*)*)" + // Group 3: The p-params
"=([^|=,]*(?:,[^|=,]*)*)" // Group 4: The q-params
);
Matcher matcher = pattern1.matcher("word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3");
while (matcher.find()) {
String word = matcher.group(1);
String partOfSpeech = matcher.group(2);
String pParamString = matcher.group(3);
String qParamString = matcher.group(4);
String[] pParams = pParamString.split(",");
String[] qParams = qParamString.split(",");
// Do something with the above variables...
}
我使用了
[^ |=,]*
来匹配任何非特殊字符。在正则表达式中不能有可变数量的捕获组。在.Net中,每个组可以有多个捕获,但在Java中不能。您的问题是,正则表达式引擎只存储每个组的最后一次成功匹配。你能做的最好的事情就是把所有的p和q参数匹配成两大组,然后把它们分开
Pattern pattern1 = Pattern.compile(
"([^|=,]*)" + // Group 1: The word. Zero or more characters.
"=([^|=,]*)" + // Group 2: The part of speech.
",?([^|=,]*(?:,[^|=,]*)*)" + // Group 3: The p-params
"=([^|=,]*(?:,[^|=,]*)*)" // Group 4: The q-params
);
Matcher matcher = pattern1.matcher("word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3");
while (matcher.find()) {
String word = matcher.group(1);
String partOfSpeech = matcher.group(2);
String pParamString = matcher.group(3);
String qParamString = matcher.group(4);
String[] pParams = pParamString.split(",");
String[] qParams = qParamString.split(",");
// Do something with the above variables...
}
我使用
[^ |=,]*
来匹配任何非特殊字符。我假设word3=PS2,p7,p8=q4,q5,q6 |=PS3,p9=
不是一个真实的输入示例。你能提供一个实际输入的例子吗。另外,我对=
符号的使用有些困惑。例如,作为本例中的尾随字符。我假设word3=PS2,p7,p8=q4,q5,q6 |=PS3,p9=
不是输入的真实示例。你能提供一个实际输入的例子吗。另外,我对=
符号的使用有些困惑。例如,作为本例中的尾随字符。谢谢!我使用了相同的解决方案)谢谢!我使用了相同的解决方案)