如何使用Java Regex提取字符串列表中的目标短语?
提取括号内短语的正则解决方案
嘿,刚学正则遇到这种卡壳的情况太正常了!我来帮你搞定这个短语提取的问题~
先看你给出的示例字符串:
01/01/2018 123 -TESTING. PHRASE (I want to get this phrase) 98765 1.274.89
你想要的是括号里的I want to get this phrase,对吧?咱们一步步来解决:
针对你的场景的核心正则
要提取括号内的内容(不含括号本身),可以用这个正则:
\((.*?)\)
拆解一下这个正则的逻辑:
\(:转义左括号,因为括号在正则里是特殊分组字符,必须加反斜杠才能匹配实际的左括号(.*?):非贪婪捕获组,.*匹配任意字符(默认不含换行),?让它变成非贪婪模式——意思是匹配到第一个右括号就停止,避免误匹配后面的内容\):转义右括号,匹配实际的右括号
怎么在代码里用?
举个Python的例子(其他语言逻辑类似,只是API细节不同):
import re # 你的示例字符串 sample_text = "01/01/2018 123 -TESTING. PHRASE (I want to get this phrase) 98765 1.274.89" # 用正则搜索匹配 match_result = re.search(r'\((.*?)\)', sample_text) if match_result: # group(1)取捕获到的括号内的内容 target_phrase = match_result.group(1) print(target_phrase) # 输出: I want to get this phrase
为什么你之前的正则没用?
^[a-zA-Z]\D+$:这个正则是匹配整行以字母开头、后面全是非数字的内容,但你的目标短语在字符串中间,且原字符串包含大量数字,完全不适用[\w[.*]]+:这个写法本身有语法错误,字符组[]内的嵌套写法不合法,也没有针对括号的结构设计,自然匹配不到目标内容
进阶:如果括号里有换行怎么办?
如果你的短语可能跨换行,需要开启“DOTALL”模式(不同语言叫法略有差异),让.能匹配换行符:
- Python里加
re.DOTALL参数:match_result = re.search(r'\((.*?)\)', sample_text, re.DOTALL) - Java里用
Pattern.DOTALL标记:Pattern pattern = Pattern.compile("\\((.*?)\\)", Pattern.DOTALL); Matcher matcher = pattern.matcher(sampleText);
内容的提问来源于stack exchange,提问作者Matheus Grossi
相关产品推荐
相关产品推荐

