有些东西你永远match不上 (java)

在看regular expression java应用时,发现API里面的Pattern class 的 match method.

它的DOC显示的是attempt to match the entire input sequence against the pattern   这就早就了它奇特的属性:某种pattern你无论有什么样的input sequence它都match不上

可以写这么一个命题:

对于任意的string, 存在某个正则表达式(pattern),使得 Pattern.matches(pattern,string) 返回值为false

 

那么,这个正则表达式长什么样子呢?如果是一般的字符串那肯定可以match上,如果是一些character class里面的construct像/d [x-z] 等等 也可以写出某个string让它match上。甚至,连一些special control character(ctrl alt ...)只要在string里面写ASCII码一样可以match. 那到底是什么不能match呢?

 

大家如果留心看java documentation Pattern那章的Summary of regular-expression constructs表就会发现最后还有个special constructs 像(?... )这样的。它就像个探测器,看看左边,再看看右边,如果满足条件就返回true。例如 (?<=/()/d+(?=/)) 这样的正则表达式, 那么字符串 java(123)java 中就有满足该正则表达式的部分--123,因为123左边有个左括号,右边有个右括号; 而java123java就不行了,因为123没有被括号包围住。

 

我们的Pattern.matches()里 正则表达式和string必须得全部相符才能match,而正则表达式中 (?=...)这一部分只表明string中某个字符前或后有这样的形式(例如括号);该形式(例如括号)出现在了string中,则其必须与正则表达式pattern里的某部分匹配;而正则表达式中没有匹配的...  因此有了(?=...) 并且在此之前没有可以与该形式(例如括号)匹配的形式的话,那么永远就没有string可以与该正则表达式match

 

如下:

瞧瞧,什么样的aString可以让第一行返回true? 答案是没有

 

因此在上述的命题里,pattern写成lookaround的形式,即(?<=certainChar)certainChar(?=certainChar) 那么什么样的字符串就与这正则表达式永远match不上了。

你一定会瞪大眼睛说--啊,怎么会有match不上的string呢?一定是正则表达式出了问题!哈哈,看看命题是怎么说?命题只说了是存在某个正则表达式,并没有说任意的正则表达式都不能match啊 :)  (像离散数学中的:∀p∃q  and ∀p∀q  are not equivalent)

我们可以改改正则表达式 /((?<=/()/d+(?=/)) /) , 这样就有字符串entirely matched

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8 中的 Stream 接口提供了许多方法,其中包括 `match` 方法。`match` 方法用于检查流中的元素是否满足指定的条件。`match` 方法有三个变体:`allMatch`、`anyMatch` 和 `noneMatch`。它们分别表示:全部匹配、任意匹配和有匹配。 下面是 `match` 方法的用法示例: 假设有一个 `List` 对象 `list`,其中包含整数元素。我们可以使用 `stream` 方法将其转换为一个流,并使用 `match` 方法检查流中的元素是否满足指定条件。 ```java List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 检查是否所有元素都大于 0 boolean allMatch = list.stream().allMatch(i -> i > 0); System.out.println(allMatch); // true // 检查是否存在元素大于 5 boolean anyMatch = list.stream().anyMatch(i -> i > 5); System.out.println(anyMatch); // true // 检查是否不存在元素小于 0 boolean noneMatch = list.stream().noneMatch(i -> i < 0); System.out.println(noneMatch); // true ``` 在以上示例中,首先将 `list` 对象转换为一个流,然后使用 `allMatch` 方法检查流中的所有元素是否都大于 0,如果都大于 0,则返回 `true`。接着使用 `anyMatch` 方法检查流中是否存在元素大于 5,如果存在,则返回 `true`。最后使用 `noneMatch` 方法检查流中是否不存在元素小于 0,如果不存在,则返回 `true`。 需要注意的是,在使用 `match` 方法时,流必须是有序的,否则结果可能是错误的。如果流是无序的,可以使用 `sorted` 方法对其进行排序,然后再使用 `match` 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值