【问题标题】:Regular expression in java (java String)java中的正则表达式(java字符串)
【发布时间】:2020-10-29 15:04:40
【问题描述】:

来自这个 -> 承包商:“嗨,我是“保罗”,你好吗?客户:“嗨....”

我只想说 -> 嗨,我是“保罗”,你好吗?

我需要一个 java 中的正则表达式来做到这一点,我尝试了一下,但我对内部引号 (\") 感到困惑,这让我发疯了。

感谢任何提示。

【问题讨论】:

  • 你必须使用正则表达式吗?您可以使用 .indexOf() 和 .substring() 去除关键字周围的冗余文本
  • 简单地说——你需要将文本放在一对双引号"the text to be matched"中,而这个文本可能包含其他双引号,前面有一个反斜杠\"?
  • @AlexRudenko 。是的,亚历克斯,我编辑了这个问题,因为编辑器不会跳过内部引用

标签: java regex string


【解决方案1】:

Java 支持lookbehinds,所以普通的正则表达式:

"(.*?(?<!\\))"

在 Java 字符串中(参见 https://stackoverflow.com/a/37329801/1225328):

\"(.*?(?<!\\\\))\"

实际文本将包含在每个匹配项的第一组中。

演示:https://regex101.com/r/8OXujX/2


例如,在 Java 中:

String regex = "\"(.*?(?<!\\\\))\"";
String input = "contractor:\"Hi, this is \\\"Paul\\\", how are you?\" client:\"Hi ....\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) { // or while (matcher.find()) to iterate through all the matches
    System.out.println(matcher.group(1));
} else {
    System.out.println("No matches");
}

打印:

Hi, this is \"Paul\", how are you?

【讨论】:

  • 这将包括最后的“嗨....”。 OP 不希望这样。
  • 是的,我相信应该采取第一场比赛,至少在 OP 的例子中。
  • 适用于在线正则表达式编辑器,但不适用于 java 代码
【解决方案2】:

正则表达式应该是这样的:"(?:\\.|[^"\\])*"

Online demo

它使用非捕获组?:,匹配任何字符.或不在双引号和反斜杠列表中的单个字符。

【讨论】:

  • 不是 OP 的要求。
【解决方案3】:
var text1 = "contractor:\"Hi, this is \\\"Paul\\\", how are you?\" client:\"Hi ....\" <-";
    var regExWithQuotation = "contractor:(.+\".+\".+) client:";
    Pattern p = Pattern.compile(regExWithQuotation);

    var m = p.matcher(text1);
    ;
    if (m.find()) {
        var res = m.group(1);
        System.out.println(res);
    }

    var regExWithoutQuotation = "contractor:\"(.+\".+\".+)?\" client:";
    p = Pattern.compile(regExWithoutQuotation);
    m = p.matcher(text1);

    if (m.find()) {
        var res = m.group(1);
        System.out.println(res);
    }

输出是:

“嗨,我是“保罗”,你好吗?”

嗨,我是“保罗”,你好吗?

【讨论】:

    【解决方案4】:

    您可以使用正则表达式(?&lt;=contractor:\").*(?=\" client:)

    正则表达式的描述:

    1. (?&lt;=contractor:\") 为 contractor:\" 指定 positive lookbehind
    2. .* 指定任意字符
    3. (?=\" client:) 为 \" client: 指定正向前瞻

    简而言之,任何以contractor:\" 开头并以\" client: 结尾的内容

    演示:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
        public static void main(String[] args) {
            String str = "contractor:\"Hi, this is \\\"Paul\\\", how are you?\" client:\"Hi ....\"";
            String regex = "(?<=contractor:\").*(?=\" client:)";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                System.out.println(matcher.group());
            }
        }
    }
    

    输出:

    Hi, this is \"Paul\", how are you?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多