正则表达式和Java编程语言

正则表达式——详解 正则表达式(Regular Expression,通常简写为 regex、regexp 或 RE)是一种强大的,用于描述一组字符串的模式。,几乎所有现代编程语言都支持正则表达式的使用,包括 Java 和 JavaScript (Vue.js 应用中的 JavaScript 代码)。在实际开发中,。 阅读详情
正则表达式和Java编程语言
文章目录

正则表达式和Java编程语言
by Dana Nourie and Mike McCloskey
2001年8月
2002年4月修订

应用程序常常需要有文本处理功能,比如单词查找、电子邮件确认或XML文档 集成。这通常会涉及到模式匹配。Perl、sed或awk等语言通过使用正则表达式来 改善模式匹配,正则表达式是一串字符,它所定义的模式可用来查找匹配的文本。 为了使用JavaTM编程语言进行模式匹配,需 要使用带有许多charAt子字串的StringTokenizer 类,读取字母或符号以便处理文本。这常常导致复杂或凌乱的代码。

现在不一样了。

2平台标准版(J2SETM)1.4版包含一个名 为java.util.regex的新软件包,使得使用正则表达式成为可能。 目前的功能包括元字符的使用,它赋予正则表达式极大的灵活性

本文概括地介绍了正则表达式的使用,并详细解释如何利用 java.util.regex软件包来使用正则表达式,用以下常见情形作为 例子:

 

  • 简单的单词替换
  • 电子邮件确认
  • 从文件中删除控制字符
  • 查找文件

 

为了编译这些例子中的代码和在应用程序中使用正则表达式,需要安装 J2SE 1.4版。

 

构造正则表达式

 

正则表达式是一种字符模式,它描述的是一组字符串。你可以使用 java.util.regex软件包,查找、显示或修改输入序列中出现的 某个模式的一部分或全部。

正则表达式最简单的形式是一个精确的字符串,比如“Java”或 “programming”。正则表达式匹配还允许你检查一个字符串是否符合某个具体的 句法形式,比如是不是一个电子邮件地址。

为了编写正则表达式,普通字符和特殊字符都要使用:

 

/$^.*
+?['']
/.
 
   

 

正则表达式中出现的任何其他字符都是普通字符,除非它前面有个 /。

特殊字符有着特别的用处。例如,.可匹配除了换行符之外的任意字符。与 s.n这样的正则表达式匹配的是任何三个字符的、以s 开始以n结束的字符串,包括sun和son 。

在正则表达式中有许多特殊字符,可以查找一行开头的单词,忽略大小写或 大小写敏感的单词,还有特殊字符可以给出一个范围,比如a-e表 示从a到e的任何字母。

使用这个新软件包的正则表达式用法与Perl类似,所以如果你熟悉Perl中正则 表达式的使用,就可以在Java语言中使用同样的表达式语法。如果你不熟悉正则 表达式,下面是一些入门的例子:

 

构造匹配于
 
字符 
x字符 x
//反斜线字符
/0n八进制值的字符0n (0 <= n <= 7)
/0nn八进制值的字符 0nn (0 <= n <= 7)
/0mnn八进制值的字符0mnn 0mnn (0 <= m <= 3, 0 <= n <= 7)
/xhh十六进制值的字符0xhh
/uhhhh十六进制值的字符0xhhhh
/t制表符('/u0009')
/n换行符 ('/u000A')
/r回车符 ('/u000D')
/f换页符 ('/u000C')
/a响铃符 ('/u0007')
/e转义符 ('/u001B')
/cxT对应于x的控制字符 x
 
字符类
[abc]a, b, or c (简单类)
[^abc]除了a、b或c之外的任意 字符(求反)
[a-zA-Z]a到z或A到Z ,包含(范围)
[a-z-[bc]]a到z,除了b和c : [ad-z](减去)
[a-z-[m-p]]a到z,除了m到 p: [a-lq-z]
[a-z-[^def]]d, e, 或 f
 
预定义的字符类
.任意字符(也许能与行终止符匹配,也许不能)
/d数字: [0-9]
/D非数字: [^0-9]
/s空格符: [ /t/n/x0B/f/r]
/S非空格符: [^/s]
/w单词字符: [a-zA-Z_0-9]
/W非单词字符: [^/w]

 

有关进一步的详情和例子,请参阅 Pattern类的文档。

类和方法

 

下面的类根据正则表达式指定的模式,与字符序列进行匹配。

Pattern类

Pattern类的实例表示以字符串形式指定的正则表达式,其语 法类似于Perl所用的语法。

用字符串形式指定的正则表达式,必须先编译成Pattern类的 实例。生成的模式用于创建Matcher对象,它根据正则表达式与任 意字符序列进行匹配。多个匹配器可以共享一个模式,因为它是非专属的。

用compile方法把给定的正则表达式编译成模式,然后用 matcher方法创建一个匹配器,这个匹配器将根据此模式对给定输 入进行匹配。pattern 方法可返回编译这个模式所用的正则表达 式。

split方法是一种方便的方法,它在与此模式匹配的位置将给 定输入序列切分开。下面的例子演示了:

 

/*
* 用split对以逗号和/或空格分隔的输入字符串进行切分。
*/
import java.util.regex.*;

public class Splitter {
public static void main(String[] args) throws Exception {
// Create a pattern to match breaks
Pattern p = Pattern.compile("[,//s]+");
// Split input with the pattern
String[] result = 
	 p.split("one,two, three   four ,  five");
for (int i=0; i<result.length; i++)
System.out.println(result[i]);
}
}

Matcher类

 

Matcher类的实例用于根据给定的字符串序列模式,对字符序 列进行匹配。使用CharSequence接口把输入提供给匹配器,以便 支持来自多种多样输入源的字符的匹配。

通过调用某个模式的matcher方法,从这个模式生成匹配器。 匹配器创建之后,就可以用它来执行三类不同的匹配操作:

 

  • matches方法试图根据此模式,对整个输入序列进行匹配。
  • lookingAt方法试图根据此模式,从开始处对输入序列进 行匹配。
  • find方法将扫描输入序列,寻找下一个与模式匹配的地方。

 

这些方法都会返回一个表示成功或失败的布尔值。如果匹配成功,通过查询 匹配器的状态,可以获得更多的信息

这个类还定义了用新字符串替换匹配序列的方法,这些字符串的内容如果需 要的话,可以从匹配结果推算得出。

appendReplacement方法先添加字符串中从当前位置到下一个 匹配位置之间的所有字符,然后添加替换值。appendTail添加的 是字符串中从最后一次匹配的位置之后开始,直到结尾的部分。

例如,在字符串blahcatblahcatblah中,第一个 appendReplacement添加blahdog。第二个 appendReplacement添加blahdog,然后 appendTail添加blah,就生成了: blahdogblahdogblah。请参见示例 简单的单词替换。

CharSequence接口

CharSequence接口为许多不同类型的字符序列提供了统一的只 读访问。你提供要从不同来源搜索的数据。用String, StringBuffer 和CharBuffer实现CharSequence,,这样就可以很 容易地从它们那里获得要搜索的数据。如果这些可用数据源没一个合适的,你可 以通过实现CharSequence接口,编写你自己的输入源。

 

Regex情景范例

 

以下代码范例演示了java.util.regex软件包在各种常见情形 下的用法:

简单的单词替换

 

/*
* This code writes "One dog, two dogs in the yard."
* to the standard-output stream:
*/
import java.util.regex.*;

public class Replacement {
public static void main(String[] args) 
			 throws Exception {
// Create a pattern to match cat
Pattern p = Pattern.compile("cat");
// Create a matcher with an input string
Matcher m = p.matcher("one cat," +
		   " two cats in the yard");
StringBuffer sb = new StringBuffer();
boolean result = m.find();
// Loop through and create a new String 
// with the replacements
while(result) {
m.appendReplacement(sb, "dog");
result = m.find();
}
// Add the last segment of input to 
// the new String
m.appendTail(sb);
System.out.println(sb.toString());
}
}

 

电子邮件确认

以下代码是这样一个例子:你可以检查一些字符是不是一个电子邮件地址。 它并不是一个完整的、适用于所有可能情形的电子邮件确认程序,但是可以在 需要时加上它。

 

/*
* Checks for invalid characters
* in email addresses
*/
public class EmailValidation {
public static void main(String[] args) 
					 throws Exception {
					 
String input = "@sun.com";
//Checks for email addresses starting with
//inappropriate symbols like dots or @ signs.
Pattern p = Pattern.compile("^//.|^//@");
Matcher m = p.matcher(input);
if (m.find())
System.err.println("Email addresses don't start" +
				" with dots or @ signs.");
//Checks for email addresses that start with
//www. and prints a message if it does.
p = Pattern.compile("^www//.");
m = p.matcher(input);
if (m.find()) {
System.out.println("Email addresses don't start" +
	" with /"www./", only web pages do.");
}
p = Pattern.compile("[^A-Za-z0-9//.//@_//-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;

while(result) {
deletedIllegalChars = true;
m.appendReplacement(sb, "");
result = m.find();
}

// Add the last segment of input to the new String
m.appendTail(sb);

input = sb.toString();

if (deletedIllegalChars) {
System.out.println("It contained incorrect characters" +
			   " , such as spaces or commas.");
}
}
}

 

从文件中删除控制字符

 

/* This class removes control characters from a named
*  file.
*/
import java.util.regex.*;
import java.io.*;

public class Control {
public static void main(String[] args) 
					 throws Exception {
					 
//Create a file object with the file name
//in the argument:
File fin = new File("fileName1");
File fout = new File("fileName2");
//Open and input and output stream
FileInputStream fis = 
			  new FileInputStream(fin);
FileOutputStream fos = 
			new FileOutputStream(fout);

BufferedReader in = new BufferedReader(
		   new InputStreamReader(fis));
BufferedWriter out = new BufferedWriter(
		  new OutputStreamWriter(fos));

// The pattern matches control characters
Pattern p = Pattern.compile("{cntrl}");
Matcher m = p.matcher("");
String aLine = null;
while((aLine = in.readLine()) != null) {
m.reset(aLine);
//Replaces control characters with an empty
//string.
String result = m.replaceAll("");
out.write(result);
out.newLine();
}
in.close();
out.close();
}
}

 

文件查找

/*
* Prints out the comments found in a .java file.
*/
import java.util.regex.*;
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
import java.nio.channels.*;

public class CharBufferExample {
public static void main(String[] args) throws Exception {
// Create a pattern to match comments
Pattern p = 
Pattern.compile("//.*$", Pattern.MULTILINE);

// Get a Channel for the source file
File f = new File("Replacement.java");
FileInputStream fis = new FileInputStream(f);
FileChannel fc = fis.getChannel();

// Get a CharBuffer from the source file
ByteBuffer bb = 
fc.map(FileChannel.MAP_RO, 0, (int)fc.size());
Charset cs = Charset.forName("8859_1");
CharsetDecoder cd = cs.newDecoder();
CharBuffer cb = cd.decode(bb);

// Run some matches
Matcher m = p.matcher(cb);
while (m.find())
System.out.println("Found comment: "+m.group());
}
}

 

结论

现在Java编程语言中的模式匹配和许多其他编程语言一样灵活了。可以在应 用程序中使用正则表达式,确保数据在输入数据库或发送给应用程序其他部分之 前,格式是正确的,正则表达式还可以用于各种各样的管理性工作。简而言之, 在Java编程中,可以在任何需要模式匹配的地方使用正则表达式。

更多信息

软件包java.util.regex

Java编程论坛

Java编程论坛

 

Dana Nourie是JDC技术方面的作家。她热衷于研究Java平台,特别是使 用服务器小程序和JavaServer Pages技术创建交互式Web应用程序,比如 JDC 测验和 学习之路以及 循序渐进这些页面。她还是一位潜水员,正在寻找太平洋深水海马。

Mike McCloskey 是Sun公司的一位工程师,致力于Core Libraries for J2SE(J2SE核心库)的开发。 java.lang, java.util, java.io 和,以及新软件包java.util.regex和java.nio.中 都有他的一份功劳。他喜欢打壁球和写科幻小说。

 

 

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路) 时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。 阅读详情

相关推荐

5G NR 帧结构

本节主要介绍5G NR中的帧结构[38.211-4.3]。5G帧结构(Frame Structure)为时域结构。其设计比其4G LTE更为灵活,这种灵活性使5G能够根据应用需求(如增强移动宽带eMBB,超高可靠低时延通信URLLC)进行调整,同时支持差异化的应用场景,提高了5G的利用效率与响应能力。具体而言,5G帧结构是基于时隙和OFDM符号设计的,且5G网络能够根据服务需求动态调整各时隙持续时长。

夫子喵的博客 5286

JAVA中正则表达式的应用(二)java.util.regex篇(转)

现在JDK1.4里终于有了自己的正则表达式API包,JAVA程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表

rkind的专栏 983

SAM3模型国内快速上手:Modelscope权重下载+环境配置一条龙指南

本文详细介绍了SAM3模型在国内的快速部署方案,包括通过Modelscope平台下载权重文件、优化CUDA 11.8环境配置以及实战避坑技巧。针对国内开发者常见的网络问题和环境兼容性问题,提供了从权重下载到模型加载的全流程指南,帮助用户高效完成部署并快速上手SAM3模型。

weixin_28465009的博客 1143

Google Java编码风格

前言 以下是摘自Hawstein的博客Google Java编程风格指南的学习笔记,下面仅列出我认为比较重要的知识点,没涉及到的可能是显而易见或约定俗成或者我觉得不重要的规范。使用良好的编码风格是coding最基本的素质之一。 1 源文件 1 源文件统一编码为UTF-8 2 特殊字符情形 a 除了行结束符外,空格是源文件唯一允许出现的空白字符,所有其他ASCII空白字符军需要进行转义...

dianliaocha5758的博客 235

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1716

韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。本文重点介绍了服务端的启动链路、网络初始化和连接处理这三个过程,并简要分析的游戏循环的实现与数据包处理,在下一篇文章中,我们会从客户端角度分析从游戏启动、登录、游戏开始和基础游戏交互的全流程。

东方猫的博客 2497

java正则表达式

现在JDK1.4里终于有了自己的正则表达式API包,JAVA程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表...

翔的窝窝 218

华为OD机试双机位C卷-开心消消乐(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【开心消消乐】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 开心消消乐。

qq_45776114的博客 1512

JAVA正则表达式 Pattern和Matcher

1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。  它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。  Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与P

mywebstudy的专栏 584

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2642

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 836

java接口CharSequence源码分析

目录 简介 前面4个方法 后面两个方法 简介 字符序列,被String,StringBuilder,StringBuffer继承。 /** * <p>一个CharSequence是一个可读的char值的序列。 * 这个接口为许多不同种类的char序列提供统一的,只读的访问。 * 一个char值代表了BMP的一个字符或者一个代理。 * 有关详细信息,请参阅Unico...

今天吃了吗的博客 411

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 190

正则表达式和Java编程语言1zz

http://dayouluo.cnblogs.com/archive/2005/10/03/248302.html 正则表达式(Regular Expression)简介:正则表达式具有两种标准:基本的正则表达式(BRE),扩展的正则表达式(ERE)。ERE包括BRE功能和另外其它的概念。应用程序常常需要有文本处理功能,比如单词查找、电子邮件确认或XML文档 集成。这通常会涉及到模式匹配。P

fbysss的专栏 1736

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

正则表达式 - 示例

正则表达式是一种功能强大的文本处理工具,通过使用正则表达式,我们可以轻松地处理复杂的文本匹配和替换任务。掌握正则表达式的基础知识和应用场景,对于提高编程技能和文本处理效率都是非常有帮助的。

lly202406的博客 425

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA常用API - 正则表达式

大家好,我是最爱吃兽奶,今天给大家介绍一下正则表达式,跟着我的脚步一起去看看吧!一,正则表达式是什么?正则表达式是一种用来匹配和处理文本的工具,它可以用一些特定的符号和语法来描述一类字符串的模式。在计算机科学和各种编程语言中,正则表达式被广泛应用于文本搜索、替换、过滤、验证等方面。通过正则表达式,我们可以轻松地匹配出符合某种模式的文本,例如匹配电子邮件地址、电话号码、网址等。从而实现各种文本处理的功能。

weixin_73869209的博客 2471

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java正则表达式获取xml文件中指定节点的值

/** * 获取指定标签中的内容 * * @param xml 传入的xml字符串 * @param label 指定的标签 */ public static List<String> getFieldListByRegex(String xml, String label) { //正则表达式 ...

FinelyYang的专栏 6322

android: java 、python正则表达式的区别

在python java编程语言间来回切换,怎样使在 python中运行良好的正则表达式移植到java中,反之依然。 python的正则表达式有match/search之分 Python根据正则表达式提供两种不同的基本操作:match只在字符串的开始确认一个匹配,而search在字符串的任何匹配的位置都确认. Regular expressions module of Python is ca...

u011279649的专栏 1761

正则表达式实用指南(二):转移字符、量词和捕获小能手

Java 正则表达式 API 也接受预定义字符类。Java 版本正则表达式的一个特殊之处在于转义字符。如我们所见,大多数预定义字符类以反斜杠“\”开头,而反斜杠在 Java 中有特殊含义。为了让Pattern类能够正确编译这些字符类,必须对开头的反斜杠进行转义,即\d要写成\\d。匹配数字,等同于[0-9]匹配非数字,等同于[^0-9]");");正则表达式是一个开发利器,用的好的话,会大大提升我们的开发效率。

沉潜飞动 928
上一篇: vc控制台Timer程序
下一篇: Java Web Start技术自述
hua_java
博客等级 码龄20年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值