背景
今天运营反馈一个问题,自己扫描的单词记录看不到,看了下日志显示同步的英语不符合要求,限制了符合以下正则表达式的句子才会入库:
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());
}
}
}