Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用正则表达式保存子字符串

使用正则表达式保存子字符串
EN

Stack Overflow用户
提问于 2010-06-09 23:22:58
回答 2查看 5.1K关注 0票数 2

我对Java (或任何语言)中的正则表达式都是新手,我想使用它们来做一个查找。我不知道该怎么做的棘手部分是替换字符串中匹配的内容。

例如,如果我要查找的代码行是

代码语言:javascript
运行
AI代码解释
复制
Person item6 [can {item thing [wrap]}]

我可以编写一个正则表达式来查找这一行,但是查找单词"thing“是什么(因为它在不同的行中可能不同)是我的问题。我可能希望将该单词替换为其他单词,或者将其保存在变量中以备后用。使用Java的regex引擎有什么简单的方法可以做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-09 23:49:17

是。您将其包装在“捕获组”中,这只是正则表达式中与感兴趣的单词匹配的部分的一些()。

下面是一个示例:

代码语言:javascript
运行
AI代码解释
复制
public static void main(String[] args) {

    Pattern pat = Pattern.compile("testing (\\d+) widgets");

    String text = "testing 5 widgets";

    Matcher matcher = pat.matcher(text);

    if (matcher.matches()) {
        System.out.println("Widgets tested : " + matcher.group(1));
    } else {
        System.out.println("No match");
    }

}

Pattern和Matcher来自java.util.regex。String类中有一些快捷方式,但它们是最灵活的

票数 3
EN

Stack Overflow用户

发布于 2010-06-10 08:26:36

问题说明不是很清楚,但这里有一些想法可能会起作用:

使用lookarounds和replaceAll/First

下面的正则表达式匹配前面是字符串"{item ",后面是字符串" ["\w+。Lookaround仅用于精确匹配\w+。元字符{[根据需要进行转义。

代码语言:javascript
运行
AI代码解释
复制
String text =
    "Person item6 [can {item thing [wrap]}]\n" +
    "Cat item7 [meow meow {item thang [purr]}]\n" +
    "Dog item8 [maybe perhaps {itemmmm thong [woof]}]" ;

String LOOKAROUND_REGEX = "(?<=\\{item )\\w+(?= \\[)";

System.out.println(
    text.replaceAll(LOOKAROUND_REGEX, "STUFF")
);

这将打印:

代码语言:javascript
运行
AI代码解释
复制
Person item6 [can {item STUFF [wrap]}]
Cat item7 [meow meow {item STUFF [purr]}]
Dog item8 [maybe perhaps {itemmmm thong [woof]}]

参考文献

使用捕获组而不是查找

Lookaround应该被明智地使用。Lookbehinds特别是在Java中是非常有限的。一种更常用的技术是使用捕获组来匹配更多有趣的部分。

下面的正则表达式匹配前面的类似模式\w+,但也包括"{item "前缀和" ["后缀。此外,item中的m可以无限制地重复(这是Java中无法匹配的)。

代码语言:javascript
运行
AI代码解释
复制
String CAPTURING_REGEX = "(\\{item+ )(\\w+)( \\[)";

System.out.println(
    text.replaceAll(CAPTURING_REGEX, "$1STUFF$3")
);

这将打印:

代码语言:javascript
运行
AI代码解释
复制
Person item6 [can {item STUFF [wrap]}]
Cat item7 [meow meow {item STUFF [purr]}]
Dog item8 [maybe perhaps {itemmmm STUFF [woof]}]

我们的模式有3个捕获组:

代码语言:javascript
运行
AI代码解释
复制
(\{item+ )(\w+)( \[)
\________/\___/\___/
 group 1    2    3

请注意,我们不能简单地用"STUFF"替换匹配的内容,因为我们匹配了一些“无关”的部分。我们对替换它们不感兴趣,所以我们捕获这些部分并将它们放回替换字符串中。在Java语言中,我们引用替换字符串中捕获的组的方式是使用$符号;因此在上面的示例中使用$1$3

参考文献

使用Matcher获得更大的灵活性

并不是所有的事情都可以通过替换字符串来完成。例如,Java没有将捕获的字符串大写的后处理功能。在这些更一般的替换方案中,您可以使用如下所示的Matcher循环:

代码语言:javascript
运行
AI代码解释
复制
Matcher m = Pattern.compile(CAPTURING_REGEX).matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    System.out.println("Match found");
    for (int i = 0; i <= m.groupCount(); i++) {
        System.out.printf("Group %d captured <%s>%n", i, m.group(i));
    }
    m.appendReplacement(sb,
        String.format("%s%s %<s and more %<SS%s",
            m.group(1), m.group(2), m.group(3)
        )
    );
}
m.appendTail(sb);

System.out.println(sb.toString());

上面的打印结果:

代码语言:javascript
运行
AI代码解释
复制
Match found
Group 0 captured <{item thing [>
Group 1 captured <{item >
Group 2 captured <thing>
Group 3 captured < [>

Match found
Group 0 captured <{item thang [>
Group 1 captured <{item >
Group 2 captured <thang>
Group 3 captured < [>

Match found
Group 0 captured <{itemmmm thong [>
Group 1 captured <{itemmmm >
Group 2 captured <thong>
Group 3 captured < [>

Person item6 [can {item thing thing and more THINGS [wrap]}]
Cat item7 [meow meow {item thang thang and more THANGS [purr]}]
Dog item8 [maybe perhaps {itemmmm thong thong and more THONGS [woof]}]

参考文献

附件

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3010684

复制
相关文章
[Golang] golang中使用正则表达式获取子字符串
我从img[/static/upload/xxxx/xxx.jpg中获取xxxx/xxx.jpg
唯一Chat
2022/05/13
6930
javascript使用正则表达式替换或者捕获子字符串
上面的代码会将字符串 '{"name":"新建文件夹 (2).zip","ext":".zip","size":1675876,"path":"/static/upload/2022December/ba145698fcc99fd414f0f4ec6ea418e5.zip"}' 输出到控制台。
唯一Chat
2022/12/27
1K0
保存和检索字符串
有时,有些事情需要存储在手机,比方说,在APP保存和使用的时间考虑password什么
全栈程序员站长
2022/07/06
3370
字符串中查找子串_cstring查找子字符串
假设要从主串 s = “goodgoogle” 中找到 t = “google” 子串。根据我们的思考逻辑,则有:
全栈程序员站长
2022/09/24
3.1K0
字符串中查找子串_cstring查找子字符串
Python使用正则表达式处理字符串
关于正则表达式基本语法请参考之前发过的文章常用正则表达式锦集与Python中正则表达式的用法,正则表达式扩展语法的高级用法后面会专门整理后再发。 Python标准库re提供了正则表达式操作所需要的功能,既可以直接使用re模块中的方法(见下表)来处理字符串。 方法功能说明compile(pattern[, flags])创建模式对象escape(string)将字符串中所有特殊正则表达式字符转义findall(pattern, string[, flags])列出字符串中模式的所有匹配项finditer(pa
Python小屋屋主
2018/04/16
1.4K0
Golang 使用正则来匹配出子字符串函数
const SERVICE_IMPL_RULE = ".*?\\.NewServer\\(new\\((.*?)\\)\\)" // getServiceImpl 返回: CompassInsigh
一个会写诗的程序员
2022/06/27
6270
[Golang] golang中使用正则表达式替换字符串
当有比较复杂的替换字符串的需求时候 可以使用我封装的这个函数,通过正则表达式把字符串替换掉 func ReplaceStringByRegex(str, rule, replace string) (string, error) { reg, err := regexp.Compile(rule) if reg == nil || err != nil { return "", errors.New("正则MustCompile错误:" + err.Error())
唯一Chat
2022/05/14
1.7K0
子字符串查找之KMP
当我们需要从文档中查找某个关键词时,就用到了子字符串查找技术。比如在某个数据库导出文档中想要查找所有用户的密码,想在一个学长给的word题库中查找你正在做的检测题的答案。就像上边这个表格,我们想要在字符串文本中查找模式所在位置,并返回这个位置给用户。这个功能是怎么实现的呢? 我们可以简单暴力的来实现,从头开始一个字符一个字符的比较字符串文本和模式,如果匹配失败,再从字符串文本的下一个位置开始跟模式从头比较,重复这个过程,如果成功,则返回模式在字符串中的起始位置。
naget
2019/07/03
9530
子字符串查找之KMP
KMP子字符串查找算法
KMP子字符串查找算法 概述 算法的基本思想是:当出现不匹配时,就能知晓一部分文本的内容,可以利用这些信息避免将指针回退到所有这些已知的字符串之前。 DFA(确定有限状态机)模拟 提前判断如何重新查找,而这种判断只取决于模式本身,所以可以对模式的字符序列做一个确定有限状态机。 DFA的数据结构表示为二维数组dfa[R][M],其中R为指定字典中的字符集的个数(比如ASCII为256),M为匹配字符串pat的长度,状态的意思是文本中某个位置i匹配pat的程度,0状态为未匹配状态,M状态为终止状态,找到了完整匹
felix
2018/06/08
1.5K0
php经典:访问子字符串
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> </head> <body> <form method="post"> <input ty
贵哥的编程之路
2021/10/09
9370
字符串——459. 重复的子字符串
示例 1: 输入: s = “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。
向着百万年薪努力的小赵
2022/12/02
1.5K0
Python判断字符串是否包含子字符串
Python如何判断一个字符串是否包含指定字符串?本文介绍Python判断一个字符串是否包含指定子串的4种方法。具有一定的借鉴价值。
全栈程序员站长
2022/09/06
2K0
Python判断字符串是否包含子字符串
子字符串查找----KMP算法
Kunth-Morris-Pratt算法的基本思想是:当出现不匹配时,就能知晓一部分内容(因为匹配失败之前的字符已经和模式相匹配)。可以利用这些信息避免指针回退。令人惊讶的是,KMP算法在匹配失败时,总能将j设置为一个值以使i不回退。 在KMP算法中,不会回退文本指针i,而是用一个数组dfa[][]来记录匹配失败时指针j应该回退多远。对于每一个字符c,在比较了c和pat.charAt(j)后,dfa[c][j]表示的是应该和下一个文本字符比较的模式字符的位置。在匹配时会继续比较下一个字符,因此dfa[pat
SuperHeroes
2018/05/30
1.2K0
PHP经典:提取子字符串
substr:整个字符串 从哪里开始(第一个是下标0) 最后是哪里(比如写8那8-1=7就对了)
贵哥的编程之路
2021/10/09
8040
PHP经典:替换子字符串
substr_replace:整个字符串(从这里结束) 替换成这个变量 从什么开始(默认从下标0开始)
贵哥的编程之路
2021/10/09
2K0
Java String 过滤子字符串
前几天写到获取Editor值的时候,获取的值(String)中竟然还包含一堆Html的标记.而我不需要或者根本不想要这些标签的存在.
用户7886150
2021/04/07
1.3K0
【题解】子字符串(简单版)
同学们都知道,字符串的概念指的是:用引号“ ”括起来的一串有限序列的字符。而子字符串就是字符串内的字符序列。
fishhh
2022/08/31
6180
正则表达式中的子组模式
作者:西瓜玩偶(racnil070512 at hotmail dot com) 一、基础知识 在PCRE正则表达式中,我们可以利用圆括号定义一个子组,我们可以使用preg_match函数(其他函数的信息请参考PHP官方API文档)的第三个参数捕获圆括号中匹配的内容: preg_match('#color\h*:\h*([A-Za-z]*)#', 'color: red', $matches); print_r($matches); 运行的结果为: Array ( [0] => colo
wangxl
2018/03/08
1.7K0
日期居然用字符串保存?我笑了
我发现数据库有些日期居然用字符串保存?于是跟几个小伙伴讨论了关于数据库的日期应该要怎么保存的问题,其实我一直都建议直接用数值保存时间戳,为什么我要这么建议呢?
张乘辉
2019/07/01
1.3K0
字符串匹配:字符串中查找某子串
我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法。而目前常用的字符串匹配算法有很多,下面就来介绍几个。
跋扈洋
2022/03/29
1.5K0

相似问题

使用正则表达式提取子字符串

11

使用正则表达式提取子字符串

20

使用正则表达式查找子字符串

51

使用正则表达式替换子字符串

31

使用正则表达式删除子字符串

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档