【问题标题】:Java Regex for Unicode or special character用于 Unicode 或特殊字符的 Java 正则表达式
【发布时间】:2019-06-27 21:04:29
【问题描述】:

我在 Javascript (NodeJS) 中有以下语句 -

const name = (name) =>
 name && !XRegExp('^[\\p{L}\'\\d][ \\p{L}\'\\d-]*[\\p{L}\'-\'\\d]$').test(name)
? 'Invalid' : undefined

此正则表达式用于 name 可以接受 .-(空格)并且应该以字符开头。

如何在 java 中实现相同的验证正则表达式。我在下面试过 -

@Pattern(regexp = "^(?U)[\\p{L}\\'\\d][ \\p{L}\\'\\d-]*[\\p{L}\\'-\\'\\d]$" , 
message="Invalid name")
String name;

【问题讨论】:

  • 在 Java AFAIK 中,unicode 内联标志是 (?u) 而不是 (?U)。此外,请注意字符类中的连字符,特别是 \\'-\\',它似乎定义了一个奇怪的字符范围。
  • @CasimiretHippolyte "UNICODE_CASE Unicode 感知大小写折叠也可以通过嵌入式标志表达式 (?u)" 和 "UNICODE_CHARACTER_CLASS 模式启用也可以通过嵌入的标志表达式 (?U) 启用。标志暗示 UNICODE_CASE,即它启用 Unicode 感知大小写折叠"
  • (?U) 是多余的,除非 \d 必须匹配波斯语、印度语等数字。
  • @CarlosHeuberger:谢谢,很高兴知道。

标签: java regex unicode


【解决方案1】:

根据您提供的内容,我猜这个表达式可能会起作用:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "^[\\p{L}\\d'][ \\p{L}\\d'-]*[\\p{L}\\d'-]$";
final String string = "éééééé";

final Pattern pattern = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

DEMO

【讨论】:

  • 您真的需要Pattern.MULTILINE 标志吗?还要注意[\\p{L}\\d']也可以写成[\\p{alnum}'](多写一个字符,但它包含字母和数字)。
  • @Emma,谢谢。我有一个问题,为什么当我做pattern.matcher(string).matches(); 时,下面的语句给了我错误的final String string = "West.-";,因为这个字符串在我的情况下是有效的。
  • @ppb West.- 真的有效吗?我看不到小数点是如何使用已发布的正则表达式验证的,但我不知道 Javascript?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2019-10-15
相关资源
最近更新 更多