regex 正则表达式来查找零个或多个不同模式的子字符串

ttygqcqt  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(201)

我想要一个正则表达式,它将返回零个或多个不同模式的匹配子字符串。

要匹配的不同模式

  1. <sym>Any value</sym>
  2. <sps>Any value</sps>
  3. <sbs>Any value</sbs>
    1.任何包含空格和特殊字符的字符串,这些字符在上述3个标记之外
    其中“任何值”是包括空格和特殊字符的任何字符串。

测试用例

  1. abcd<sps>2</sps><sbs>yy</sbs>efgh<sym>b</sym>
  2. <sym>nu</sym>Hello World<sps>6&</sps><sbs>10</sbs>With Special Characters$#<sym>b</sym>
  3. <sps>2</sps>Test<sbs>yy</sbs><sym>b</sym>End String

结果

abcd
<sps>2</sps>
<sbs>yy</sbs>  
efgh
<sym>b</sym>
<sym>nu</sym>  
Hello World 
<sps>6&</sps>  
<sbs>10</sbs>
With Special Characters$#
<sym>b</sym>
<sps>2</sps>
Test
<sbs>yy</sbs>
<sym>b</sym>
End String

我尝试了以下正则表达式:
(?([a-zA-Z0-9]+))<sym>[^.]*</sym>|<sps>[^.]*</sps>|<sbs>[^.]*</sbs>(?([a-zA-Z0-9]+))

**“测试用例1”的结果:**获得以下字符串,而我没有获得标签外的字符串。

<sps>2</sps> <sbs>yy</sbs> <sym>b</sym>

**测试用例2的结果:**获取完整的输入文本。

<sym>nu</sym>Hello World<sps>6&</sps><sbs>10</sbs>With Special Characters$#<sym>b</sym>
你能在这方面帮助我吗?先谢谢你!

5jvtdoz2

5jvtdoz21#

你应该使用一个合适的XML解析器。在C#中你可以使用XElement。这允许你使用Linq-to-XML来查询它。
由于您的XML没有根,因此我们需要添加一个根。

var myxml = @"abcd<sps>2</sps><sbs>yy</sbs>efgh<sym>b</sym>";

var doc = XElement.Parse("<Root>" + myxml + "</Root>");
var nodes = doc.Descendants()
            .Where(e => e.Name == "sps" || e.Name == "sbs")
            .Cast<XNode>()
            .Concat(doc.Nodes().OfType<XText>());
Console.WriteLine(string.Join("\r\n", nodes));

dotnetfiddle

k97glaaz

k97glaaz2#

交替似乎可以做你想做的事情。你需要一个最后的前瞻来阻止零出现的情况过度消耗。

"<sym>.+?<\/sym>|<sps>.+?<\/sps>|<sbs>.+?<\/sbs>|.+?(?=<s(?:ym|ps|bs)>|$)"gm

你也可以使用backreference来缩短它:

"<(sym|sps|sbs)>.+?<\/\1>|.+?(?=<s(?:ym|ps|bs)>|$)"gm

在这种情况下,交替被缩短为标签值,并且结束标签可以将其与反向引用\1一起重用。

相关问题