Java如何用正则表达式匹配字符串中的 '\'

CoderJia 90 2024-02-28

背景

今天运营反馈一个问题,自己扫描的单词记录看不到,看了下日志显示同步的英语不符合要求,限制了符合以下正则表达式的句子才会入库:

String regex = "^[A-Za-z0-9\s,.!?:]+$";

稍微解释下:

  • ^表示匹配字符串的开头;
  • [A-Za-z0-9\s,.!?:]表示匹配一个英文字母(大写或小写)、数字、空格、逗号、句号、感叹号、问号、或冒号中的任意一个字符;
  • +表示匹配前面的子表达式一次或多次;
  • $表示匹配字符串的结尾。

但是这次同步上了的句子下面这个,里面竟然包含反斜杠,然而运营又希望能支持,只能照改了~

{"7.pub :They went to the pub .\b8.circle :Make a circle ."}

正题

在Java中,由于反斜杠字符 \ 在正则表达式中具有特殊含义,因此在使用正则表达式匹配字符串中的 \ 时,需要使用双反斜杠 \\ 来表示一个反斜杠字符。这是因为在 Java 中,反斜杠字符本身也是一个转义字符,因此需要使用两个反斜杠来表示一个反斜杠字符。

当轻描淡写加个 \\ 以为就能解决问题时,一测试发现还是没匹配到。

String regex = "^[A-Za-z0-9\s,.!?\\:]+$";

想了下突然意识到,当打印日志显示的是 \b8 时,其实传的数据应该是 \\b8 才对。

\展示问题

所有要匹配两个 \\ 需要写四个反斜杠 \\\\ 才可以~

修改后测试果然通过,下面演示如何使用正则表达式匹配字符串中的 \

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

public class Main {
    public static void main(String[] args) {
        String input = "This is a backslash \\ test";
        String pattern = "\\\\"; // 匹配一个反斜杠字符

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(input);

        while (m.find()) {
            System.out.println("Found match at index " + m.start());
        }
    }
}