两个分隔符之间的字符

3
尝试拼凑一个正则表达式,用于返回_和_$之间的字符串(其中$是字符串结尾)。
输入:
abc_def_ghi_

期望的正则表达式结果:
def_ghi

我已经尝试了很多类似这样的组合。

((([^_]*){1})[^_]*)_$

任何帮助都将不胜感激。
注意:上述正则表达式返回的是abc_def,而不是所需的def_ghi。
3个回答

4
所以,它包括第一个_和最后一个_之间的所有内容(两个都不包括)吗?
那么请尝试:
(?<=_).*(?=_$)

希望你不使用JavaScript

解释:

(?<=_)  # Assert that the previous character is a _
.*      # Match any number of characters...
(?=_$)  # ... until right before the final, string-ending _

对于我来说,这将返回 { "abc_, "_" }。 - sgtz
1
@sgtz:你需要使用Regex.Match()方法,而不是Regex.Split() - Tim Pietzcker

1

您可以尝试利用运算符的贪婪性来获得优势:

^.*?_(.*)_$

匹配从开头(非贪婪模式)到下划线,然后从该下划线一直到字符串结尾,期望下一个下划线,然后是字符串结尾,并在第一个匹配中捕获它。

^    Beginning of string
.*?  Any number of characters, at least 0
_    Anchor-tag, literal underscore
(.*) Any number of characters, greedy
_    Anchor-tag, literal underscore
$    End of string

我不确定你为什么要使用.split()。使用提到的正则表达式进行匹配应该会返回一个捕获组,这就是你要找的那个。 - 0xCAFEBABE

0

我在一个更大的日志条目中搜索了这个:

"threat_name":"PUP.Optional.Wajam"

该格式将字段名用双引号括起来,然后是冒号,然后是值用双引号括起来。

以下是我最终得出的结果,以避免标点符号破坏正则表达式。

threat_name["][:]["](?P<signature>.*?)["]

(来自regex101.com)

  • threat_name 匹配字符 "threat_name" (区分大小写)
  • ["] 匹配列表中的任意一个字符
  • " 匹配字符 " " (区分大小写)
  • [:] 匹配列表中的任意一个字符
  • : 匹配字符 ":"
  • ["] 匹配列表中的任意一个字符
  • " 匹配字符 " " (区分大小写)
  • (?P<signature>.*?) 命名捕获组 "signature"
  • .*? 匹配除换行符以外的任意字符
  • 量词:*? 零次或多次匹配,尽可能少地匹配 [懒惰模式]
  • ["] 匹配列表中的任意一个字符
  • " 匹配字符 " " (区分大小写)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接