Java中正则表达式的用法
时间:2023-05-20 09:07:01
QUESTION
在华为杯人工智能比赛中,博主需要解决这个问题json选择格式数据,虽然 人生苦短,我用python但这只是自嘲。Java选取大json更方便。写代码时,遇到了如何用正则表达式选择字符串。
ANSWER
在寻找网上的文章时也看到了许多大佬们写的博客,在此感谢大佬们。
如何用字符串换行?
@Test public void substring() { String string = "{\"text\":\"New pictures from Ironman Hawaii and XTerra Maui online!\\nPictures from Ironman Hawaii are online!\\nThe SuperSeal Triathlon (1.5K ocean swim, 40K bike, 10K run) took place on Coronado Island, just off the coast of San Diego, California yesterday morning. The race featured a cold ocean swim, an exposed and windy bike course, followed by a soft sand and pavement run route.\",\"timestamp\":\"2019-04-20T02:21:16Z\",\"url\":\"http://michiweiss.at/stories-pid386\"}"; String s = StringUtils.substringBetween(string, "{\"text\":\"", "\",\"timestamp\""); String aaa = s.replaceAll("\\\\n", "\n"); System.out.println(s); System.out.println(aaa); }
常用的正则表达式
首先,博主一开始也很困惑是否正则表达式c 、Java、python都差不多?
往下看,其实不然。
正则表达式定义了字符串的模式。
正则表达式可用于搜索、编辑或处理文本。
正则表达式不仅限于某种语言,而且在每种语言中都有细微的差异。
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\ 表示:我想插入一则表达式的反斜线,所以后面的字符有特殊的意义。
所以,在其他的语言中(如 Perl),一个反斜杠 \ 它足以起到转义的作用 Java 在中正则表达式中,需要两个反斜杠才能分析成其他语言的转义。也可以简单理解 Java 在正则表达式中,有两种 \\ 代表其他语言之一 \,这就是为什么一个数字的正则表达是 \\d,表示普通的反斜杠是 \\。
字符 |
说明 |
---|---|
\ |
将下一个字符标记为特殊字符、文本、反向引用或八进制转义符。 n匹配字符 n。\n 匹配换行符 \\\\ 匹配 \\ ,\\( 匹配 (。 |
^ |
匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"位置匹配后。 |
$ |
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"匹配之前的位置。 |
* |
零或多次匹配前面的字符或子表达式。zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
|
匹配前面的字符或子表达式一次或多次。"zo "与"zo"和"zoo"匹配,但与"z"不匹配。 等效于 {1,}。 |
? |
零或一次匹配前面的字符或子表达式。"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。 |
{ n} |
n 是非负整数。正好匹配。 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。 |
{ n,} |
n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o "。"o{0,}"等效于"o*"。 |
{ n,m} |
m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?注:您不能在逗号和数字之间插入空间。 |
? |
当此字符紧随任何其他限定符(*、 、?、{ n}、{ n,}、{ n,m})之后,匹配模式是"非贪心的"。"非贪心的"模式与搜索到的字符串尽可能短,默认"贪心的"模式与搜索到的尽可能长的字符串相匹配。例如,在字符串中"oooo"中,"o ?"只匹配单个"o",而"o "匹配所有"o"。 |
. |
匹配除"\r\n"其他任何单个字符。如果要匹配,包括"\r\n"请使用任何字符,如"[\s\S]"等模式。 |
(pattern) |
匹配 pattern 并捕获匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集中检索捕获的匹配。如果要匹配括号字符 ( ),请使用"\("或者"\)"。 |
(?:pattern) |
匹配 pattern 但不捕获匹配的子表达式,即非捕获匹配,不存储供以后使用。这是为了使用"or"字符 (|) 组合模式部件的情况非常有用。industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。 |
(?=pattern) |
实施正向预测先搜索的子表达式匹配 pattern 字符串的起点。它是一种非捕获匹配,即未来无法捕获的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即匹配后,下一个匹配的搜索跟随上一个匹配,而不是形成预测先行的字符。 |
(?!pattern) |
执行反向预测先搜索的子表达式,表达式匹配不匹配 pattern 搜索字符串起点的字符串。它是一种非捕获匹配,即未来不能捕获匹配。Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Winows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
x|y |
匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。 |
[xyz] |
字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
[^xyz] |
反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
[a-z] |
字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
[^a-z] |
反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。 |
\b |
匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。 |
\B |
非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。 |
\cx |
匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。 |
\d |
数字字符匹配。等效于 [0-9]。 |
\D |
非数字字符匹配。等效于 [^0-9]。 |
\f |
换页符匹配。等效于 \x0c 和 \cL。 |
\n |
换行符匹配。等效于 \x0a 和 \cJ。 |
\r |
匹配一个回车符。等效于 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
\S |
匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 |
\t |
制表符匹配。与 \x09 和 \cI 等效。 |
\v |
垂直制表符匹配。与 \x0b 和 \cK 等效。 |
\w |
匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。 |
\W |
与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。 |
\xn |
匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。 |
\num |
匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。 |
\n |
标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
\nm |
标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 |
\nml |
当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
\un |
匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 |
介绍常用的用法
replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。
// 按指定模式在字符串查找
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
System.out.println("Found value: " + m.group(3) );
} else {
System.out.println("NO MATCH");
如果感到有用,请点击关注和点赞,一起进步呀!