正则表达式 JAVA 示例

定义:

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

正则表达式百度百科定义

要点

1.正则是匹配模式,要么匹配字符,要么匹配位置。
2.在正则中可以使用括号捕获数据,要么在API中进行分组引用,要么在正则里进行反向引用。

正则表达式在JAVA中的应用:

Java 正则表达式和 Perl 的是最为相似的。
java.util.regex 包主要包括以下三个类:

Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

在JAVA中的基础运用
1:捕获数组
2:查询方法
3:替换方法

常被用到的正则表达式

1:如何从字符串中提取数字

在JAVA中, \d表示(0-9)范围的数字.尽量使用正则表达式可以使
请注意\ d中的第一个反斜杠.如果您在字符串文本中使用预定义字符(特殊字符),则必须在反斜杠之前加上另一个反斜杠,以便转义该字符串。 这就是为什么我们需要使用\d

List<Integer> numbers = new LinkedList<Integer>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while (m.find()) {
numbers.add(Integer.parseInt(m.group()));
}

2:如何根据换行来拆分字符串

根据不同的系统,至少有如下3中换行分隔符

\r represents CR (Carriage Return), which is used in Unix
\n means LF (Line Feed), used in Mac OS
\r\n means CR + LF, used in Windows

String lines[] = String.split("\\r?\\n");
String.split("[\\r\\n]+")
String.split(System.getProperty("line.separator"));

Pattern.compile()的重要性

Pattern.compile()方法是创建Pattern对象实例的唯一方法。一般如下使用

//创建Pattern对象
Pattern p = Pattern.compile("a*b");
//创建Matcher对象
Matcher matcher = p.matcher("aaaaab");
//判断是否匹配
assert matcher.matches() == true;

//-----Patternd对象实例p只需创建一次,可以多少使用,匹配不同的Matcher-----------
Matcher anotherMatcher = p.matcher("aab");
assert anotherMatcher.matches() == true;

//-----------Pattern.matches 只能使用一次--------------------------------------------------
boolean b = Pattern.matches("a*b", "aaaaab");

文本类容如果使用表达式

一般使用斜杠""来转译,但在字符串内容时,有些麻烦别扭,这时我么可以使用如下方法,来避免 \5 or []5的写法。

Pattern.quote("$5");

//不使用 \\$5 or [$]5

String.split()的分隔字符串为什么需要先转译

因为在JAVA表达式中支持分隔符,如字符“|”,在JAVA中没有区分开来,
A|B的意思是A或者B,要把斜杠“|”表示成字母,则需要转译

需要在字符“|” 之前添加斜杠 \, 如下  \\|

JAVA表达式如果匹配重复出现n次的情况

如: ab, aabb, and aaabbb

Pattern p = Pattern.compile("(?x)(?:a(?= a*(\\1?+b)))+\\1");
// true
System.out.println(p.matcher("aaabbb").matches());
// false
System.out.println(p.matcher("aaaabbb").matches());
// false
System.out.println(p.matcher("aaabbbb").matches());
// false
System.out.println(p.matcher("caaabbb").matches());

7:如果用单个空格替换2个及以上的空格,及删除最前面空格?

String line = " aa bbbbb ccc d ";
// " aa bbbbb ccc d "
System.out.println(line.replaceAll("[\\s]+", " "));

8:如判断一个素数

public static void main(String[] args) {
// false
System.out.println(prime(1));
// true
System.out.println(prime(2));
// true
System.out.println(prime(3));
// true
System.out.println(prime(5));
// false
System.out.println(prime(8));
// true
System.out.println(prime(13));
// false
System.out.println(prime(14));
// false
System.out.println(prime(15));
}
public static boolean prime(int n) {
return !new String(new char[n]).matches(".?|(..+?)\\1+");
}

9:如何用分隔符分割一个字符串,并忽略逗号。

public static void main(String[] args) {
String line = "aaa,bbb,\"c,c\",dd;dd,\"e,e";
List<String> toks = splitComma(line);
for (String t : toks) {
System.out.println("> " + t);
}
}
private static List<String> splitComma(String str) {
int start = 0;
List<String> toks = new ArrayList<String>();
boolean withinQuote = false;
for (int end = 0; end < str.length(); end++) {
char c = str.charAt(end);
switch(c) {
case ',':
if (!withinQuote) {
toks.add(str.substring(start, end));
start = end + 1;
}
break;
case '\"':
withinQuote = !withinQuote;
break;
}
}
if (start < str.length()) {
toks.add(str.substring(start));
}
return toks;
}

找到重复的内容

String str = "123456";
Pattern p = Pattern.compile("(\\d\\d\\d)\\1");
Matcher m = p.matcher(str);
System.out.println(m.groupCount());
while (m.find()) {
String word = m.group();
System.out.println(word + " " + m.start() + " " + m.end());
}

找到重复一次的单词

String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b";
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
String phrase = "unique is not duplicate but unique, Duplicate is duplicate.";
Matcher m = p.matcher(phrase);
while (m.find()) {
String val = m.group();
System.out.println("Matching subsequence is \"" + val + "\"");
System.out.println("Duplicate word: " + m.group(1) + "\n");
}

常用的正则表达式
正则表达式资料1
正则表达式资料2

正则表达式资料3
https://github.com/ziishaned/learn-regex
https://github.com/gedoor/learn-regex-zh

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容