Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获组仅返回每个组的最后一次出现_Java_Regex_Regex Group - Fatal编程技术网

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,…-一些参数(可选)

  • 第一季度、第二季度、第三季度其他一些参数(也是可选的)

我想构建regex,它在文本中查找所有出现的此类字符串,并为我提供组:

  • 第1组-单词
  • 组2-词性标记
  • 第三组,第四组,…-参数p
  • 组(k),组(k+1),…-其他参数(q)
我不关心最后一个p参数和第一个q参数的组的索引。我应该知道,第一组是单词(可能为空),第二组是词性,其他组是参数p和q

现在我有了这样的正则表达式:

"([a-z]*)?=([A-Z]+)(,?[a-z]+)*=(,?[a-z]+)*")
但它不能正常工作。它只显示最后的参数p和q。即(对于S2):

  • group1=word3-正常
  • 组2=PS2-正常
  • 组3=p8-不正常(仅最后一个p参数)
  • 组4=q6-不正常(也是最后一个q参数)
你能帮我吗

更新: “=”-仅字符p参数和q参数之间的拆分字符。这在我的问题上没有必要。你应该认为,p参数和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=
不是输入的真实示例。你能提供一个实际输入的例子吗。另外,我对
=
符号的使用有些困惑。例如,作为本例中的尾随字符。谢谢!我使用了相同的解决方案)谢谢!我使用了相同的解决方案)