【问题标题】:When use java regular-expression pattern.matcher(), source does not match regex.But, my hope result is ,source matches regex使用 java 正则表达式 pattern.matcher() 时,源不匹配正则表达式。但是,我希望结果是,源匹配正则表达式
【发布时间】:2017-12-04 03:25:50
【问题描述】:

当使用java正则表达式pattern.matcher()时,源不匹配正则表达式。但是,我希望结果是,源匹配正则表达式。

  • String source = "ONE.TWO"
  • String regex = "^ONE\\.TWO\\..*"
导入 java.util.regex.Pattern; 公共类测试{ 公共静态无效主要(字符串[]参数){ 测试(); } 公共静态无效测试(){ 测试字符串Demo = new Test(); stringDemo.testMatcher(); } 公共无效 testMatcher() { 字符串源 = "ONE.TWO"; 字符串正则表达式 = "^ONE\\.Two\\..*"; // 结果 = false, "不匹配"。但是,希望结果是真的,“匹配” 匹配器(来源,正则表达式); } 公共无效匹配器(字符串源,字符串正则表达式){ 模式模式 = Pattern.compile(regex); 布尔匹配 = pattern.matcher(source).matches(); 如果(匹配){ System.out.println("匹配"); } 别的 { System.out.println("不匹配"); } } }

【问题讨论】:

  • 为什么你的希望是“真的”? ^^ 因为它不能工作的原因有很多,更容易的是'W'不匹配'w'

标签: java regex string match


【解决方案1】:

在您的代码中,您的正则表达式期望TWO 中的o 为小写,并期望其后跟.

试试:

String source = "ONE.TWo.";

这将匹配您在问题中编码的正则表达式。

表达式\. 表示匹配文字点(而不是任何字符)。当你把它编码成一个 Java 字符串时,你必须用另一个反斜杠来转义反斜杠,所以它变成了"\\."

表达式末尾的.* 表示“匹配零个或多个任意字符(换行符除外)”。

所以这也会匹配:

String source = "ONE.TWo.blah blah";

【讨论】:

  • 它对我有用。谢谢你。我不能修改String regex = "^ONE\\.TWO\\..*" ,因为它是一个API请求的响应。但是我可以修改我的使用source:boolean match = pattern.matcher(source).matches() || pattern.matcher(source + ".").matches();
【解决方案2】:

模式匹配默认区分大小写。在您的情况下,源有一个大写的 O,而正则表达式有一个小写的 o。

所以你必须添加Pattern.CASE_INSENSITIVE或更改o的大小写

Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE );

String regex = "^ONE\\.TWO\\..*";

【讨论】:

  • 我不能修改String regex = "^ONE\\.TWO\\..*" ,因为它是一个API请求的响应。但是,还是谢谢你。
【解决方案3】:

您的正则表达式有点不正确。你这里多了一个点:

String regex = "^ONE\.TWO\.(extra dot).*"

试试这个,不带点:

String regex = "^ONE\.TWO.*"

【讨论】:

  • 我不能修改String regex = "^ONE\\.TWO\\..*" ,因为它是一个API请求的响应。但是,还是谢谢你。
【解决方案4】:

它不匹配有两个原因:

  • 您的正则表达式 "^ONE\\.TWo\\..*" 不区分大小写,那么您如何期望 TWo 匹配 TWO
  • 您的正则表达式需要一个 . 字符结尾,而您的字符串 "ONE.TWO" 没有它。

使用以下 Regex 来匹配您的源字符串:

String regex = "^ONE\\.TWO\\.*.*";

【讨论】:

  • 我无法修改String regex = "^ONE\\.TWO\\..*" ,因为它是一个API请求的响应。但是,还是谢谢你。
  • @Vicky 所以你需要调整正则表达式来匹配它。
  • 是的。正则表达式列表是 api 响应。这个正则表达式列表对大多数数据都很有用。只有两个正则表达式没有用。我必须为特殊情况编写额外的自定义正则表达式。
【解决方案5】:

String regex = "^ONE\\.TWO\\..*"

正则表达式中的双斜杠\\ 是转义序列,以匹配源字符串中的单斜杠\

末尾的.* 匹配除换行符之外的任何字符0 or More times

要匹配正则表达式,您的来源应该像

String source = "ONE\.TWO\three blah @#$ etc" OR
String source = "ONE\.TWO\.123@#$ etc"

基本上是任何以 ONE\.TWO\ 开头且没有换行符的字符串。

【讨论】:

  • 没有。对于 java,反斜杠必须转义一次,对于正则表达式引擎,最终必须转义一次(如果您需要匹配一个点,例如"\\\\.")。 "\." 是无效的 Java 字符串。此代码无法编译。
猜你喜欢
  • 2022-12-11
  • 1970-01-01
  • 2016-11-10
  • 2011-07-24
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多