如何用正则表达式提取第二个‘-’与第二个‘.’间的非包含字符串?
正则表达式提取特定范围内容(不同分隔符场景)
嘿,这问题我熟!你要从this-is-a.test.sentence这类字符串里精准提取a.test,规则是从第二个-开始、到第二个.结束,还不能包含这两个分隔符对吧?当分隔符是不同字符的时候,核心思路就是精准定位两个不同的分隔节点,然后捕获中间的内容。
直接可用的正则表达式
我给你两种常用写法,按需选就行:
写法1:分组捕获(最直观,适合需要明确提取组的场景)
^[^-]+-[^-]+-(.*?)\..*$
写法2:正向断言(直接匹配目标内容,无需额外取分组)
(?<=^[^-]+-[^-]-).*?(?=\..*)
逐段解释(以写法1为例)
咱们拆解一下每个部分的作用,方便你以后改分隔符:
^:锚定字符串开头,避免匹配到中间的片段[^-]+:匹配任意非-的字符至少一次,对应第一个-之前的this-:精准匹配第一个-[^-]+:再匹配一段非-的字符,对应is-:匹配第二个-,这就是我们要跳过的起始分隔符(.*?):非贪婪匹配任意字符,直到遇到下一个.,这个分组就是我们要的a.test(非贪婪是关键,避免匹配到后面的.)\.:匹配第二个.,也就是结束的分隔符.*$:匹配剩下的所有内容直到字符串结尾,确保整个字符串都被覆盖
灵活调整分隔符
如果以后你的分隔符变了(比如起始分隔是_,结束分隔是|),只需要把正则里的-和.换成对应字符就行。比如:
^[^_]+_[^_]+_(.*?)\|.*$
逻辑完全一致,只是替换了分隔符而已。
测试小提示
你可以用本地编辑器(比如VS Code的正则查找)或者终端工具(比如grep -P、sed)来测试,输入this-is-a.test.sentence,就能看到提取结果正好是a.test。
内容的提问来源于stack exchange,提问作者AJG
相关产品推荐
相关产品推荐

