gpt4 book ai didi

Java正则表达式匹配双引号子字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:16 24 4
gpt4 key购买 nike

我想解析以下字符串:

String text = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
// "w1 w"2" w3 | w4 w"5 "w6 w7"

我正在使用 Pattern.compile(regex).matcher(text),所以我在这里缺少的是正确的正则表达式。规则是正则表达式必须:

  • 隔离任何一个单词
  • 任何被双引号括起来的子串都是匹配的
  • 必须忽略单词中的双引号(稍后我将用空格替换它们)。

所以结果匹配应该是:

  1. w1 w"2
  2. w3
  3. |
  4. w4
  5. w"5
  6. w6 w7

双引号是否包含在双引号包围的子字符串中是无关紧要的(例如 1. 可以是 w1 w"2"w1 w"2").

我想出的是这样的:

"\"(.*)\"|(\\S+)"

我还尝试了上述正则表达式的许多不同变体(包括向后/向前),但没有一个给我预期的结果。

关于如何改进它有什么想法吗?

最佳答案

试试这个正则表达式:

(?:(?<=^")|(?<=\s")).*?(?="(?:\s|$))|(?![\s"])\S+

Click for Demo

解释:

  • (?:(?<=^")|(?<=\s")) - 正向后视以找到前面有 " 的位置.这"要么需要在字符串的开头,要么在空格之后
  • .*? - 懒惰地匹配除换行符以外的任何字符出现次数超过 0 次
  • (?="(?:\s|$)) - 正向前瞻以验证到目前为止匹配的任何内容是否后跟一个空格或匹配后没有任何内容($)。
  • | - 或(以上匹配项或以下匹配项)
  • (?![\s"]) - 否定前瞻以验证位置后面没有空格或 "
  • \S+ - 匹配出现次数超过 1 次的非空白字符

Java 代码( Generated from here ):

Run code here to see the output

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyClass {
public static void main(String args[]) {
final String regex = "(?:(?<=^\")|(?<=\\s\")).*?(?=\"(?:\\s|$))|(?![\\s\"])\\S+";
final String string = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}

}
}

输出:

enter image description here

关于Java正则表达式匹配双引号子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com