1. 正则表达式的应用

在给用户发送消息时通常情况会有相同的消息模板,但其中部分信息跟用户相关,因此需要对消息模板中的变量部分进行替换。而对于一个系统而言可能有很多套完全不同的模板。因此需要一个通用的根据实际信息替换消息模板中变量的方法。消息模板的变量与velcity中的变量规范相同。

publicstatic <K, V> String replacePlaceHolderWithMapValue(String msg,Map<K,V> placeHolderMap) {
              Patternpattern = Pattern.compile("\\$*!?\\{([\\w] )\\}");
              Matchermatcher = pattern.matcher(msg);
              Map<String,String> replaceList = new HashMap();
              while(matcher.find()) {
                     StringplaceHolder = matcher.group(0);
                     Stringkey = matcher.group(1);
                     Objectvalue = placeHolderMap.get(key);
                     if(value != null) {
                            replaceList.put(placeHolder,value.toString());
                     }
              }
              for(Entry<String, String> keyValue:replaceList.entrySet()) {
                     msg= msg.replace(keyValue.getKey(), keyValue.getValue());
              }
              returnmsg;
       }

方法中先获取所有的需要替换的变量存入replaceList中,然后再依次替换。上述方法的正则表达式中,([\\w] )表示对匹配的内容中进行捕获,捕获值存入matcher.group中,当然也可以有多个捕获。

2. 常用正则表达式

[abc]     a、b 或 c(简单类)

[^abc]   任何字符,除了 a、b 或 c(否定)

[a-zA-Z] a到 z 或 A 到 Z,两头的字母包括在内(范围)

[a-d[m-p]]   a到 d 或 m 到 p:[a-dm-p](并集)

[a-z&&[def]]       d、e 或 f(交集)

[a-z&&[^bc]]      a 到 z,除了 b 和 c:[ad-z](减去)

[a-z&&[^m-p]]   a 到 z,而非 m 到 p:[a-lq-z](减去)

.      任何字符(与行结束符可能匹配也可能不匹配)

\d   数字:[0-9]

\D  非数字: [^0-9]

\s   空白字符:[\t\n\x0B\f\r]

\S   非空白字符:[^\s]

\w  单词字符:[a-zA-Z_0-9]

\W 非单词字符:[^\w]

\p{Lower}   小写字母字符:[a-z]

\p{Upper}  大写字母字符:[A-Z]

X?   X,一次或一次也没有

X*   X,零次或多次

X  X,一次或多次

X{n}      X,恰好 n 次

X{n,}     X,至少 n 次

X{n,m}  X,至少 n 次,但是不超过 m 次

(X) X,作为捕获组

非捕获

(?=X)    X,通过零宽度的正lookahead

(?!X)      X,通过零宽度的负lookahead

(?<=X)  X,通过零宽度的正lookbehind

(?<!X)   X,通过零宽度的负lookbehind

(?>X)    X,作为独立的非捕获组

3 贪婪匹配与懒惰匹配

考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。

public static void main(String[] args) {
        String str = "北京市(海淀区)(朝阳区)";
        String paternStr = ".*(?=\\()";
        Pattern pattern = Pattern.compile(paternStr);
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            System.out.println(matcher.group(0));
        }
}

上述方法的输出为:北京市(海淀区)

public static void main(String[] args) {
        String str = "北京市(海淀区)(朝阳区)";
        String paternStr = ".*?(?=\\()";
        Pattern pattern = Pattern.compile(paternStr);
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            System.out.println(matcher.group(0));
        }
}

上述方法输出:北京市

补充:其它的一些用法

Pattern.split(CharSequence input)

这个方法跟String.split()方法效果类似

Pattern p2 = Pattern.compile("[a-z] ");
// str的长度为2,返回"我爱"和"哈哈",跟 String[] arr = "我爱java哈哈".
String[] arr = p2.split("我爱java哈哈");
Arrays.stream(arr).forEach(System.out::println);

Pattern.matcher(String regex,CharSequence input)

一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串,效果与Pattern.compile(regex).matcher(input).matches() 类似

Pattern p = Pattern.compile("\\d ");
// 返回\d 
System.out.println(p.pattern());
// p.pattern()返回\d , 这里为true,只有当全部满足则为true
System.out.println(Pattern.matches(p.pattern(), "2223"));
// 返回false,只要一个不满足,则返回false
System.out.println(Pattern.matches(p.pattern(), "2223b"));

总结

到此这篇关于Java中Pattern用法实例的文章就介绍到这了,更多相关正则表达式Pattern用法内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Java中Pattern用法实例(正则表达式)的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  8. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

  9. Swift3.0-正则表达式 &lt;待续&gt;

    贡献者:赵大财博客:https://my.oschina.net/zhaodacaiGitHub:https://github.com/zhaodacai邮箱:zhaodacai@yeah.comQQ:327532817=============================先直接来代码:NSRegularExpression.OptionscaseInsensitive不区分大小写allowC

  10. 迅速 – IBInspectable创建一个下拉和更好的组织

    简而言之,我想创建一个@IBInspectable属性,使您可以在故事板中从下拉菜单中选择一系列的内容.另外如果有办法创建分隔符,更好地组织IBInspectables,我想知道这是否也可能.在我的示例中,我想为电话号码创建正则表达式字符串,以便当我去故事板时,我可以在下拉菜单中选择“电话号码”项,而不是输入正则表达式字符串.目前,我已经将一个TextField子类化,以便我可以将更多的IBIns

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部