当前位置: 首页 > 知识库问答 >
问题:

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

墨雨华
2023-03-14

我想解析以下字符串

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),所以我这里缺少的是正确的正则表达式。规则是正则表达式必须:

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

因此,结果匹配应该是:

    < li>w1 w"2 < li>w3 < li>| < li>w4 < li>w"5 < li>w6 w7

双引号是否包含在双引号括起来的子字符串中是无关紧要的(例如,1. 可以是 w1 w“2 或 ”w1 w“2”)。

我想出的是这样的:

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

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

对如何改进这一点有什么想法吗?

共有2个答案

黎阳冰
2023-03-14

这似乎可以做到:

"(?:[^"]|\b"\b)+"|\S+

调试演示

Regex101演示

请注意,在 Java 中,由于我们对正则表达式使用字符串文字,因此反斜杠前面需要另一个反斜杠:

String regex = "\"(?:[^\"]|\\b\"\\b)+\"|\\S+";
沙靖琪
2023-03-14

试试这个正则表达式:

(?:(?

点击查看演示

解释:

  • (?:(?

Java代码(从这里生成):

在此处运行代码以查看输出

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));
        }
    }

    }
}

输出:

 类似资料:
  • 我面临一个挑战,要以以下格式匹配输入: 输入由key=value对组成。关键字以斜杠开头。值可以是数字或引号中的字符串。 该值可以选择性地包含转义引号,即引号后面跟着引号(“”)。这种转义引号应该被视为价值的一部分。不需要检查转义引号是否平衡(例如,由另一个转义引号结束)。 正则表达式应该匹配序列中给定的key=value部分,并且对于长输入(例如value是10000个字符)不应该中断。

  • 问题内容: 我想构建一个简单的正则表达式,以涵盖带引号的字符串,包括其中的所有转义引号。例如, 显然,类似 不起作用,因为它与第一个转义的引号匹配。 什么是正确的版本? 我想对于其他转义字符,答案是相同的(只需替换相应的字符)。 顺便说一句,我知道“包罗万象”的正则表达式 但我会尽量避免使用它,因为毫不奇怪,它的运行速度要比更具体的设备慢。 问题答案: 所有其他答案的问题是,它们只适合最初的明显测

  • 问题内容: 什么正则表达式将匹配Java中的任何ASCII字符? 我已经尝试过: 但是发现它与我想要的很多东西都不匹配(例如空格,括号等)。我希望避免以如下格式显式列出所有127个ASCII字符: 问题答案: 我没用过但是我用过

  • 这是我之前问题的后续。我意识到我需要更具体地说明我的regex案例,以获得适用于我的案例的答案。 我已经与这个正则表达式斗争了很长一段时间(也使用我上一个问题的答案),我似乎无法构建我需要的东西。 我需要将所有字符串中出现的两个重复出现的单引号替换为(因此字符串内部意味着单引号)。这是因为在一种语言(语法)中,字符串中的引号使用<code>‘转义。 这里有一个例子(实际的例子可以包含用< code

  • 有没有一种方法使组的“capture”可以在regex后面引用,但其捕获的值不在匹配列表中返回? 或者其他一些方法来解决我(看似简单)的问题。

  • 我正在尝试匹配以下正则表达式: 换句话说,一个单词边界后跟上面的任何字符串(可选地跟一个句点字符),后面跟一个单词边界。 我也在regex101上尝试过这一操作,但与数仍然不匹配:https://regex101.com/r/klkmwl/1 转义符并没有什么区别,我已经尝试使用十六进制转义序列来代替和符(如本问题所建议的)。为什么这不匹配?