正则的与或非

正则是用来匹配字符的,它一个重要用途就是搜索。

说到搜索,很容易就想到搜索引擎,比如 Google

Google 本身有一些简单搜索技巧甚是有用。

比如,实现集合运算功能:与、或、非。

本文尝试用正则来模拟一下。

1. 关键字

hello

假如你在 google 里搜索 hello,会怎样?

包含hello这个单词所有网页会被搜索出来。

上图下部分,我们用 Test框 里面文本的每一行来表示一个网页。其中每个网页中的 hello 被高亮了。

我们可以认为判断逻辑是:

/hello/i.test(page)
复制代码

为了视觉上凸显找到了正确的“网页”,我们让任何一个包含 hello 的行,整个行都高亮起来。 此时需要修改正则:

/^.*hello.*$/im.test(page)
复制代码

上述正则的意思是,允许 hello 前后都有其他字符。效果如下:

要判断字符串中是否有目标字符,其实也可以使用断言: (?=p)

/^(?=.*hello).*$/im.test(page)
复制代码

“断言”就是“能判断是不是”的语句。

(?=p) 表示当前位置后面的字符满足正则表达式 p,它匹配的是位置,不匹配任何字符。就跟 ^ 一样。

2. 与

hello world

Google 搜索 hello world 或者 hello+world。 它表示要搜索的目标网页中,同时包括 helloworld 这两个单词。

用一个正则来判断是否同时满足多个条件。最好的方法是使用 (?=p)

/^(?=.*hello)(?=.*world).*$/im.test(page)
复制代码

3. 或

hello OR world

如果在 Google 框中搜索 hello OR world 表示目标网页中有 hello 或者 world 单词。不强求二者都出现。

正则中 | 天生就是用来处理“或”的逻辑:

/^.*(hello|world).*$/im.test(page)
复制代码

用在 (?=p) 中其实也是可以的:

/^(?=.*(hello|world)).*$/im.test(page)
复制代码

4. 非

hello-world

搜索 hello-world表示,目标网页要包含 hello,但不包括 world

正则中 (?!p)(?=p) 的反义。即判断当前位置后的字符不满足正则表达式 p

/^(?=.*hello)(?!.*world).*$/im.test(page)
复制代码

5. 顺序

如果我要的目标网页中,先出现 hello,后出现 world 怎么办?

/^.*hello(?=.*world).*$/im.test(page)
复制代码

注意下图中第7行没有高亮。

这是本人本月第 4 篇来说明正则断言((?=p)、(?!p)、(?<=p)和(?<!p))用法的文章。

本文完。

欢迎阅读《JS正则迷你书》

以下是Java正则表达式中的“与”、“或”、“非”的介绍和示例: 1. “与”关系:如果正则表达式中的元素没有任何量词修饰,就是“与”关系。例如,正则表达式`abc`表示匹配包含连续的字符“abc”的字符串。 2. “或”关系:当元素都是单个字符时,就应该使用字符组`[...]`。例如,正则表达式`[abc]`表示匹配包含字符“a”、“b”或“c”的字符串。当元素不只单个字符时,就应该使用多选结构`(…|…)`.例如,正则表达式`cat|cut`表示匹配包含单词“cat”或“cut”的字符串。 3. “非”关系:使用字符组`[^...]`表示不匹配字符组中的任何一个字符。例如,正则表达式`[^abc]`表示匹配不包含字符“a”、“b”或“c”的字符串。 以下是Java正则表达式的示例: ```java // 匹配包含连续的字符“abc”的字符串 String regex1 = "abc"; String input1 = "abcdefg"; boolean isMatch1 = input1.matches(regex1); // 返回false // 匹配包含字符“a”、“b”或“c”的字符串 String regex2 = "[abc]"; String input2 = "def"; boolean isMatch2 = input2.matches(regex2); // 返回false // 匹配包含单词“cat”或“cut”的字符串 String regex3 = "cat|cut"; String input3 = "I have a cat and a cut."; boolean isMatch3 = input3.matches(regex3); // 返回true // 匹配不包含字符“a”、“b”或“c”的字符串 String regex4 = "[^abc]"; String input4 = "def"; boolean isMatch4 = input4.matches(regex4); // 返回true ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值