`

java正则表达式简介和split详细介绍

    博客分类:
  • Java
阅读更多

 

java正则表达式

Java的正则表达式是由java.util.regex的Pattern和Matcher类实现的。Pattern对象表示经编译的正则表达式。静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象。只要给Pattern的matcher( )方法送一个字符串就能获取一个Matcher对象。此外,Pattern还有一个能快速判断能否在input里面找到regex的staticboolean matches(?regex, ?input)方法以及以及能返回String数组的split( )方法,它能用regex把字符串分割开来。

Matcher的方法来查询匹配的结果了。

boolean matches()

boolean lookingAt()

boolean find()

boolean find(int start)

matches( )的前提是Pattern匹配整个字符串,而lookingAt( )的意思是Pattern匹配字符串的开头。find( )像一个迭代器,从头到尾扫描一遍字符串。上次匹配的最后将是下次匹配的开始。第二个find( )是带int参数的,正如你所看到的,它会告诉方法从哪里开始找——即从参数位置开始查找。这上面的方法都会改变匹配器开始匹配的起始位置。lookingAt( )和matches( ),只有在字符串与正则表达式一开始就相匹配的情况下才能返回true。matches( )成功的前提是正则表达式与字符串完全匹配,而lookingAt( )成功的前提是,字符串的开始部分与正则表达式相匹配。上面的几个方法都会改变匹配的一些属性。通过看源码知道Mather有下面这些属性(不止这些,这里没有贴出全部)

 

 /**
     * The storage used by groups. They may contain invalid values if
     * a group was skipped during the matching.
     */
    int[] groups;

    /**
     * The range within the sequence that is to be matched. Anchors
     * will match at these "hard" boundaries. Changing the region
     * changes these values.
     */
    int from, to;

    /**
     * Lookbehind uses this value to ensure that the subexpression
     * match ends at the point where the lookbehind was encountered.
     */
    int lookbehindTo;

    /**
     * The original string being matched.
     */
    CharSequence text;

    /**
     * Matcher state used by the last node. NOANCHOR is used when a
     * match does not have to consume all of the input. ENDANCHOR is
     * the mode used for matching all the input.
     */
    static final int ENDANCHOR = 1;
    static final int NOANCHOR = 0;
    int acceptMode = NOANCHOR;

    /**
     * The range of string that last matched the pattern. If the last
     * match failed then first is -1; last initially holds 0 then it
     * holds the index of the end of the last match (which is where the
     * next search starts).
     */
    int first = -1, last = 0;
 

 

上面的方法都会改变first,last,from,to等这些属性。Matcher的start()返回的实际上是first,end()方法换回的是last。如果first为-1是你去调用start方法会出现异常:throw new IllegalStateException("No match available");

 

下面这段代码是实例:

 

 

Matcher m = Pattern.compile("\\w+").matcher(
				"Evening is full of the linnet's wings");
		System.out.println(m.lookingAt()+"  "+m.start()+":"+m.end());
		Matcher mm = Pattern.compile("\\w+").matcher(
		"Evening");
		System.out.println(mm.matches());
		mm.reset();
		System.out.println(mm.find()+":"+m.start()+":"+m.end());
		while(mm.find()){
			System.out.println(mm.start()+mm.end());
		}
		while (m.find()){
			System.out.println(m.start()+":"+m.end());
			System.out.println(m.group());
		}
 

得到结果为:

true  0:7

true

true:0:7

8:10

is

11:15

full

16:18

of

19:22

the

23:29

linnet

30:31

s

32:37

wings

 

 

现在看正则表达式的应用,像String类中有split(reg,limit)方法,这个方法实际上是又调用了Pattern.compile(regex).split(str, n) 

我们看split应用实例:

 

String newStr = "AaaaA";
String[] bb = p.split(newStr);
System.out.println(Arrays.toString(bb));
 

这样会得到一个很难理解的结果:[, A, , A]

这样很奇怪怎么是这样呢。一般人会理解为[A,A]。其实上面的相当与下面的

 

String newStr = "AaaaA";
Pattern p = Pattern.compile("a*");
Matcher m =p.matcher(newStr);
int index=0;
List<String> list = new ArrayList<String>();
while(m.find()){
	System.out.println(m.start()+":"+m.end());
	String str = newStr.substring(index, m.start());
	System.out.println(str);
	list.add(str);
	index=m.end();
}
System.out.println(Arrays.toString(list.toArray()));

 通过看源码你会发现split的实现其实和上面是同一种方式的。只是写得更复杂,而没那么简单而已。这样我们就很容易理解了。所以要得到[A,A]的结果,只需改变正则表达式为"a+"即可。

 写道
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<String>();
Matcher m = matcher(input);

// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}

// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};

// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());

// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
 

随便提一下java正则表达式和javascript还是有点小区别的。javascript中这样写

 

var s ="AaaaA"

var patt=/a*/

console.log(s.split(patt))

得到的结果也是:

 

 

["A", "A"]

 

 

 

分享到:
评论

相关推荐

    JAVA正则表达式大全

    以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`...

    Java正则表达式详细讲解

    以上就是Java正则表达式的详细讲解,从基础概念到高级用法,涵盖了正则表达式在Java中的各种操作。通过熟练掌握这些知识,可以大大提高你在处理字符串时的效率和灵活性。在实际项目中,结合`MLDN魔乐JAVA_59正则...

    java正则表达式匹配全角空格

    ### Java正则表达式匹配全角空格 在Java编程中,处理字符串是非常常见的需求之一。其中,使用正则表达式来对字符串进行拆分、替换等操作是一种非常高效的方法。本文将详细介绍如何使用Java中的`split()`方法,并...

    java正则表达式学习

    【Java正则表达式学习】 Java正则表达式是Java编程语言中用于处理字符串的强大工具,自JDK1.4版本起被引入。它源于PHP并迅速流行,主要用于复杂字符串的验证和处理。正则表达式可以高效地完成对字符串的检查、分割...

    java正则表达式及例子 pdf

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,...通过阅读《Java 正则表达式的总结和一些小例子.pdf》和《Java正则表达式详解.pdf》,你将能够深入学习和实践更多正则表达式的用法,进一步提升编程技能。

    正则表达式工具类,正则表达式封装,Java正则表达式

    总之,`RegUtils`是一个为了简化Java正则表达式操作而设计的工具类,它通过封装各种常见的正则表达式操作,使得开发者可以更方便地在代码中进行文本处理。在实际项目中,此类的使用能提高代码的可读性和可维护性。...

    java-正则表达式-正则表达式元素介绍

    在Java中,你可以使用`matches()`方法来检查一个字符串是否完全符合某个正则表达式模式,`split()`方法将字符串根据正则表达式分割成多个子字符串,以及`replaceAll()`方法替换字符串中符合正则表达式的部分。...

    java_zhengze.rar_正则表达式_正则表达式 java

    本资料"java_zhengze.rar"提供了对Java正则表达式的详细讲解,包括基本概念、元字符、预定义字符类以及各种匹配操作,对于Java开发者来说是一份非常实用的学习资源。 首先,我们来了解一下正则表达式的基石——元...

    java正则表达式资料下载

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找...提供的文档"正则表达式.doc"可能包含了更多关于Java正则表达式的详细信息,包括更多示例和具体用法,建议仔细阅读和研究。

    java正则表达式从入门到精通

    Java正则表达式是Java编程语言中的一个强大工具,用于处理字符串匹配、查找、替换等操作。它基于Perl风格的正则表达式,为开发者提供了高效且灵活的文本处理能力。在这个“Java正则表达式从入门到精通”的主题中,...

    Java正则表达式的总结和一些小例子

    Java 正则表达式的总结和一些小例子 Java 正则表达式是 Java 编程语言中一个非常重要的组件,它可以用于文本显示、数据表示、查找键和许多其他目的。从 Java 1.4 开始,Java 核心 API 就引入了 java.util.regex ...

    java正则表达式

    Java正则表达式是处理文本数据的重要工具,理解和熟练掌握其使用能极大地提高编程效率。通过学习和实践,你可以编写出更复杂的模式,解决各种字符串处理问题。在实际开发中,结合Java的`Pattern`和`Matcher`类,正则...

    JAVA正则表达式4种常用功能

    JAVA正则表达式4种常用功能 JAVA正则表达式是一种强大的字符串处理工具,自从JDK1.4开始,SUN公司就已经对其提供了支持。正则表达式可以实现多种功能,以下将会详细介绍四种常用的功能:查询、提取、分割和替换。 ...

    java正则表达式详解java正则表达式详解

    了解并熟练运用这些Java正则表达式的基本概念和操作,能够帮助开发者高效地处理字符串,进行数据验证、搜索和替换等任务。通过不断地实践和学习,你可以更深入地理解这个强大的工具,并将其应用到各种复杂的文本处理...

    Java正则表达式详解

    ### Java正则表达式详解 #### 一、正则表达式简介 正则表达式是一种强大的文本模式匹配工具,能够帮助开发者高效地处理各种文本数据。一个正则表达式是由普通字符(例如字母 a 到 z)和特殊字符(称为元字符)组成...

    JAVA 正则表达式 教程

    Java中的正则表达式主要通过`java.util.regex`包中的几个核心类来实现:`Pattern`、`Matcher`和`PatternSyntaxException`。 - **Pattern**:用于编译正则表达式,创建模式对象。 - **Matcher**:用于执行匹配操作。...

    java中的正则表达式

    #### 二、Java正则表达式基础 在Java中,`java.util.regex`包提供了用于处理正则表达式的类库,主要包括`Pattern`、`Matcher`等类。 - **Pattern**: 表示编译后的正则表达式模式。 - **Matcher**: 用于执行正则...

    Java各种验证的正则表达式

    通过学习和熟练掌握这些Java正则表达式,开发者可以在程序中实现高效的数据验证,提升代码质量。同时,理解正则表达式的原理和技巧,还能帮助解决复杂的数据处理问题,提高编程效率。在实际项目中,可以根据需求组合...

    java中用正则表达式检测IP地址是否合理

    本文将详细介绍如何使用Java中的正则表达式来检查一个IP地址的有效性。 #### 1. 正则表达式简介 正则表达式是一种强大的文本处理工具,它可以通过单一的字符串来描述一组字符串,并能够快速地进行匹配、查找或替换...

Global site tag (gtag.js) - Google Analytics