java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍

假如现在有一个需求,要你用java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来,

如:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

但[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]这样写需要转义一下,

结果为:

[-!"\#\$%&'()*+,./:;<=>?@\[\\\]\^_`\{\|\}~]

然后写到java代码后,有需要转义一次,

变为:

[-!\"\\#\\$%&'()*+,./:;<=>?@\\[\\\\\\]\\^_`\\{\\|\\}~]

这样的代码,细思极恐。惊恐

我们先来用java代码验证一下,这个长长的正则能不能用

String str="1~2-6,C#,1+2=3;@qq.com2^3functon(){}";
		String regex="[-!\"\\#\\$%&'()*+,./:;<=>?@\\[\\\\\\]\\^_`\\{\\|\\}~]";
		Matcher m=Pattern.compile(regex).matcher(str);
		while(m.find()){
			System.out.print(m.group());
		}
输出结果:

~-,#,+=;@.^(){}

很欣慰,正则应该是没错的。但这样的正则看起来挺反胃的,那么有没有简洁的写法呢?答案是有的,可以利用POSIX字符类来实现,正则为:\p{Punct}

String str="1~2-6,C#,1+2=3;@qq.com2^3functon(){}";
		String regex="\\p{Punct}";
		Matcher m=Pattern.compile(regex).matcher(str);
		while(m.find()){
			System.out.print(m.group());
		}
输出结果:

~-,#,+=;@.^(){}

简直了,是不是对正则又燃起了希望之火大笑,这就是在恰当的时候用POSIX字符类的好处。虽然平时比较少运用POSIX字符类的写法,但在恰当的时机运用起来就会有一种一鸣惊人的感觉。

那么我们来看看POSIX字符类有哪些:


除了POSIX字符类之外,还有一个也知道提一下,那就是Unicode块和类别的类



今天就介绍到这里,希望对你们有帮助。

厦门的天气一言不合就下雨,不过今天又周五了,想想还是有些许安慰的再见




<think>嗯,用户现在问的是Java正则表达式中的某个东西,不过问题没写完,可能输入被截断了。之前用户问过“\p{pucket}”,但那个术语不存在,我回复了可能的拼写错误或领域特定术语。现在用户可能继续关于正则表达式的问题,特别是Java中的某个特性,比如Unicode属性或者POSIX字符类的。 首先,我需要确认用户的问题到底是什么。可能用户想了解的是Java正则表达式中的某个特定语法,比如\p{...},比如Unicode属性,比如\p{IsAlphabetic}或者\p{L},或者其他似的结构。因为用户之前提到了\p{pucket},可能用户看到了似\p{...}的语法,但写错了,所以需要解释正确的用法。 接下来,我需要回顾Java正则表达式的相关文档,确保自己记得正确。Java中的\p{...}是用来匹配Unicode字符属性的,比如\p{L}匹配任何字母,\p{Lu}匹配大写字母,还有像\p{IsLatin}匹配拉丁字母中的字符。另外,还有POSIX字符类,比如\p{Alnum},但Java中可能不支持所有POSIX,或者语法有所不同。 另外,用户可能混淆了Perl或者其他语言的正则表达式语法,Java正则表达式虽然大部分兼容,但有些地方可能不同。比如在Java中,使用\p{Sc}来匹配货币符号,而\p{Digit}或\d匹配数字。 现在需要组织回答的结构,先介绍Java正则表达式中的Unicode属性支持,然后解释常见的\p{}用法,比如字符类别、、脚本等,再举一些例子帮助用户理解。同时,可能需要提到转义的问题,因为在Java字符串中,反斜杠需要写成两个,比如正则中的\p{L}在Java字符串里要写成"\\p{L}"。 另外,用户可能遇到的困惑是为什么某些\p{...}不工作,可能是拼写错误或者不支持该属性,这时候需要提醒检查拼写Java版本的支持情况。例如,\p{IsGreek}匹配希腊字母,而\p{InGreek}可能匹配希腊中的字符,但不同版本的Java可能支持不同属性。 最后,总结一下常见的用法,并提供示例代码,帮助用户实际应用。比如如何用正则表达式匹配汉字、货币符号,或者特定脚本的字符。确保用户能够根据这些信息解决实际问题,比如验证输入、提取特定字符等。</think>在 Java 正则表达式中,`\p{...}` 是一个**预定义字符类**的语法结构,用于匹配符合特定 Unicode 属性或分的字符。以下是详细分说明: --- ### **1. Unicode 通用类别(General Category)** **语法**:`\p{Category}` **作用**:匹配 Unicode 标准中定义的字符类别(如字母、数字、符号等)。 **常见类别**: - `L`:字母(`Lu` 大写字母,`Ll` 小写字母,`Lt` 标题字母) ```java String regex = "\\p{Lu}"; // 匹配单个大写字母(如 A, B, Ç) ``` - `N`:数字(`Nd` 十进制数字,`Nl` 字母数字) - `S`:符号(`Sc` 货币符号,`Sm` 数学符号) - `P`:标点符号(`Pd` 短横线,`Pe` 右括号) - `Z`:分隔符(`Zs` 空格分隔符) --- ### **2. Unicode 脚本(Script)** **语法**:`\p{IsScript}` **作用**:匹配特定书写系统的字符(如拉丁文、汉字、希腊文等)。 **示例**: ```java String regexHan = "\\p{IsHan}"; // 匹配汉字(如 中, 文) String regexGreek = "\\p{IsGreek}"; // 匹配希腊字母(如 α, β, Γ) ``` --- ### **3. Unicode (Block)** **语法**:`\p{InBlock}` **作用**:匹配 Unicode 中连续编码范围的字符。 **示例**: ```java String regexBasicLatin = "\\p{InBasic_Latin}"; // 匹配 ASCII 字符(U+0000–U+007F) String regexEmoji = "\\p{InEmoticons}"; // 匹配表情符号(如 😊) ``` --- ### **4. POSIX 字符类(兼容 ASCII)** **语法**:`\p{PosixClass}` **作用**:匹配传统 ASCII 字符分(与 Unix 系统兼容)。 **常见**: - `Alnum`:字母或数字(等效于 `[a-zA-Z0-9]`) - `Alpha`:字母(等效于 `[a-zA-Z]`) - `Digit`:数字(等效于 `\\d`) - `Punct`:标点符号 ```java String regexPunct = "\\p{Punct}"; // 匹配 !"#$%&'()*+,-./ 等符号 ``` --- ### **5. 自定义属性(需谨慎使用)** Java 正则表达式还支持通过 `\p{prop=value}` 匹配自定义属性,但需确保当前 Java 版本支持对应的 Unicode 标准。 --- ### **实际应用示例** **场景**:提取字符串中的所有汉字货币符号 ```java String input = "价格:¥500元,Cost: $70."; Pattern pattern = Pattern.compile("\\p{Sc}|\\p{IsHan}"); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); } // 输出:¥ 元 $ ``` --- ### **注意事项** 1. **转义问题**:在 Java 字符串中需用双反斜杠 `\\` 表示正则中的 `\`。 2. **兼容性**:Unicode 属性支持依赖 Java 版本(建议使用 JDK 7+)。 3. **大小写敏感**:类别名严格区分大小写(如 `Lu` 有效,`lu` 无效)。 如需进一步分析具体场景,请提供更多上下文! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值