2012-06-21 131 views
1

试图将一个正则表达式放在一起,它返回_和_ $之间的字符串(其中$是字符串的末尾)。两个分隔符之间的字符

输入:

abc_def_ghi_ 

所需的正则表达式outcoume:

def_ghi 

我已经尝试了不少组合,如thsi。

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

任何帮助表示赞赏。

注意:上面的正则表达式返回abc_def,而不是所需的def_ghi。

回答

4

所以这是第一个_和最后的_(都不包括在内)之间的所有内容?

然后尝试

(?<=_).*(?=_$) 

(希望你不使用JavaScript)

说明:

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

不能得到那个工作 – sgtz

+0

对于我这个返回{” abc_,‘_’}。 – sgtz

+1

@sgtz:您需要使用'Regex.Match()'方法,而不是'Regex.Split()'。 –

1

你可以尝试使用运营商的greedyness你的优势:

^.*?_(.*)_$ 

匹配从开始(非贪婪)到下划线,从该下划线到字符串末尾的所有内容(预期和下划线),然后匹配字符串的末尾,并将其捕获到第一个比赛。

^ 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 
+0

我不确定你为什么使用.split()。使用与提及的正则表达式匹配的常规匹配应返回一个捕获的组,您正在寻找的组。 – 0xCAFEBABE

0

我正在寻找一个更大的日志条目中的这样:

"threat_name":"PUP.Optional.Wajam" 

格式在双引号中的字段名称,然后一个冒号,然后在双引号中的价值。

这里是我结束了,以避免标点符号打破正则表达式..

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

(从regex101。COM)

  • threat_name字符threat_name字面上(区分大小写)
  • ["]匹配存在于低于
  • "单个字符列表中的“字面(区分大小写)
  • 列表中的单个字符相匹配[:]匹配下面列表中的单个字符
  • :字面字符:
  • ["]匹配存在于低于
  • "单个字符列表中的“字面(区分大小写)的列表中的单个字符
  • (?P<signature>.*?)命名捕获组签名
  • .*?匹配的任何字符(除新行)
  • Quantifier: *?在零和无限次之间,尽可能少的次数, 根据需要扩展[懒惰]
  • ["]匹配下面列表中的单个字符
  • "列表中的一个字符“的字面(区分大小写)
相关问题