捕获开始/结束字符内的文本但忽略加倍的结束字符

时间:2016-06-28 13:02:10

标签: c# regex

我正在尝试使用Regex将文本放在我的开头/结尾字符(“<”“>”)中,同时忽略文本中的加倍结束字符(因此“<<”应包含在捕获的数据)。

我试过

<([^>]*)>

<(.*?)>(?!>)

但我目前未能遵循以下情况:

输入:

<test>>Value>

预期产出:

test>>Value

但是我的正则表达式只捕获部分字符串。

第一个捕获

test

和第二个

test> 

可悲的是,我对如何进一步解决问题没有想法。 你们其中一个正念世界的神有什么想法如何解决这个问题?

编辑:

感谢你的答案,遗憾的是他们不符合我的另一个要求(为了让问题尽可能短,我认为这并不重要......我得知教训)

输入:

<test>>Value><test>

预期产出:

test>>Value
test

4 个答案:

答案 0 :(得分:2)

使用zero-width negative lookahead assertion匹配>未跟随另一个>来终止匹配似乎是最简单的方式:

<(.*)>(?!>)

在与test>>more匹配时捕获<test>>more>

注意,您的第二个正则表达式(<(.*?)>(?!>))正在使用最小匹配修饰符,因此将停在第一个 >,而不是另一个>

修改

有了附加信息,<test>>more><another>应抓取test>>moreanother

 <([^>]*(?:>>[^>]*)*)>

使用Regex.Matches将进行上述捕获。

扩展

 <       # Match <
 (       # Start capture
  [^>]*  #  Match many non->
  (?:    #  Start non-capturing group
   >>    #   Match >>
   [^>]* #   Match many non->
  )*     #   Repeat zero or more
 )       #  End capture
 >       # Match >

IE中。它将尖括号的内容分解为>>和非>块,并匹配不确定数量的它们。它将处理<>>>(捕获>>)。

答案 1 :(得分:2)

我在这里:)

<((?:>>|[^>])*)>

首先匹配开头<,然后尝试匹配>>,如果不匹配,则>以外的任何字符重复,直到结束>为止发现,

它也适用于增加的要求;)

Check it out here at regex101

答案 2 :(得分:1)

您可以使用:并获取第1组

(?:\<)(.*)(?:\>)

Demo and Explaination

答案 3 :(得分:-1)

(\w+)>{1,2}(\w+)

或尝试此操作,开头没有<,最后没有>