文档章节

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

Airship
 Airship
发布于 09/19 00:57
字数 813
阅读 15
收藏 0

正则表达式如何匹配一个单词存在一次零次并且不占捕获组位置

今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有人也遇到这种情况但是没找办法的时候可以参考一下。

前言

如果对正则表达式基本用法还不太熟悉的同学,可以参考下菜鸟教程上正则表达式的简单教程摸我直达

示例

例如打开一个应用。字符串可能是“open the qq”,“open qq”。“qq”是我想要得到的内容,但是这个“the”怎么办呢。

尝试一
一开始我是这么想的,把正则表达式写成这样“open the? ([A-Za-z]+[0-9]*)
显然这是不行的,不然我也不会写这博客了(刚开始用正则表达式,所以大家别笑我这样去试,哈哈),这样只会匹配“the”中的“e”。

尝试二
我又写了一个这样的“open (the)? ([A-Za-z]+[0-9]*)”,然后这样也是没办法满足我的需求的,因为这样我通过捕获组并不能正常的得到类似“qq”这样的应用名。因为“(the)?”也会被当成捕获组干扰结果。此时的我非常头大,怎么办呢怎么办呢。然后我又好好看了下菜鸟教程上正则表达式的各种语法。发现了下面这个语法。这简直就是专门为我这种情况准备的啊,既可以匹配单词,又能让他不占据捕获组的位置。
关键点

尝试三
然后我就进行了第三次尝试,正则表达式是这样的open (?:the)? ([A-Za-z]+[0-9]*)
忘了写我的测试代码了,加上

String regex = "open (?:the)? ([A-Za-z]+[0-9]*)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher("open the qq");
        if (matcher.find()) {
            System.out.println("find");
            int i = matcher.groupCount();
            System.out.println("i:" + i);
            for (int j = i; j <= i; j++) {
                System.out.println(matcher.group(j));
            }
        }

然后结果是可以的,终于可以了。
结果
然后我又试了下把输入从“open the qq”改成“open qq”
这里写图片描述
发生了啥,怎么又不行了,我该怎么办,然后我又仔细看了下自己写正则表达式,为了能够看的更加清晰,我上个图片。
这里写图片描述
红色框的地方是两空格字符,当我输入是“open qq”的时候,实际上中间只有一个空格字符,所以是无法与正则匹配的。然后我就把第二个空格改成了“\s?”,这次完整的正则就是
open (?:the)?\s?([A-Za-z]+[0-9]*)
这样不管是“open qq”还是“open the qq”,我都可以顺利得到“qq”这个应用名。

本文转载自:http://cache.baiducontent.com/c?m=9d78d513d99b12eb0bfa950e1a60d0716d2297153ac0a41568d4e25fe2604c3...

Airship
粉丝 46
博文 1077
码字总数 21664
作品 0
南京
高级程序员
私信 提问
从零开始学习正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。 参考文...

_誌念
2017/11/22
0
0
正则表达式高级用法

原文地址:http://www.cnblogs.com/kevin-yuan/archive/2012/11/11/2765340.html 正则表达式高级用法(分组与捕获) 分组的引入: 对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即...

chenzy526
2017/06/29
0
0
一次性搞懂JavaScript正则表达式之语法

本文是『horseshoe·Regex专题』系列文章之一,后续会有更多专题推出 GitHub地址:github.com/veedrin/hor… 博客地址(文章排版真的很漂亮):veedrin.com 如果觉得对你有帮助,欢迎来GitHub点...

JsTheGreat
2018/11/01
0
0
正则表达式的支持

一、匹配字符 字符类 匹配的字符 举例 d 从0-9的任一数字 dd:匹配72,但不匹配aa或7a D 任一非数字字符 DDD:匹配abc,但不匹配123 w 任一单词字符,包括A-Z,a-z,0-9和下划线 wwww:匹配Ab-...

ryan_bai
2017/10/17
0
0
正则表达式30分钟入门教程

版本:v2.33 (2013-1-10) 作者:deerchao 转载请注明来源 目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 ...

baresnail
2014/02/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

https://blog.csdn.net/nugongahou110/article/details/50668925

shzwork
2分钟前
1
0
数据仓库知识积累

1、数据仓库专题(6)-数据仓库、主题域、主题概念与定义 https://blog.csdn.net/hadoopdevelop/article/details/45296981 2、数据仓库基本知识 https://blog.csdn.net/zzq900503/article/de...

sunny小喵
22分钟前
2
0
018、Kubernetes安装前的准备

本次安装采用 Ubuntu Server X64 18.04 LTS 版本安装 kubernetes 集群环境,集群节点为 1 主 2 从模式,此次对虚拟机会有些基本要求,如下: OS:Ubuntu Server X64 18.04 LTS(16.04 版本步...

北岩
25分钟前
2
0
redis 不同数据结构的使用场景?

1. string string 类型也就是 key-value 类型 常用命令:get、set、incr 应用场景:string 是最常用的一种数据类型 2. list 常用命令:lpush,rpush,brpop,blpop 应用场景:作为消息队列,因为...

happywe
38分钟前
6
0
PG jdbc

import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement; public class PG{ public stat......

MtrS
42分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部