【问题标题】:RegEx ignoring part of string to extract out text正则表达式忽略字符串的一部分以提取文本
【发布时间】:2014-10-13 15:34:03
【问题描述】:

我有以下字符串:

@delimabc@delim@delim123@delim@delim456@delim

我需要编写一个 .Net RegEx,在这个例子中找到 3 个匹配项(但假设匹配项的数量是可变的:

  • abc
  • 123
  • 456

如何编写正则表达式,使表达式只匹配第一个和第二个@delim,然后匹配第三个和第四个等等?

以下内容当然会从@delim 字符串的第一个实例到最后一个实例进行捕获。

@delim(.+)+@delim

【问题讨论】:

  • .net 正则表达式...

标签: c# .net regex vb.net regex-lookarounds


【解决方案1】:

你可以像下面这样使用:

(?<=@delim)\w+

(?&lt;=@delim) 使用 Positive Lookbehind 将匹配字符 @delim 字面意思(区分大小写)

而\w+ 将匹配来自[a-zA-Z0-9_] 的任何单词字符。要包含或排除字符,您可以将 \w 替换为 [a-zA-Z0-9_] 并包含新字符或删除不应在您的表达式中计算的字符。

Online Demo

这是 .NET 在线演示:

.NET Online Demo

VB.NET 版本

Dim sampleInput="@delimabc@delim@delim123@delim@delim456@delim"
Dim results = Regex.Matches(sampleInput,"(?<=@delim)\w+")

For Each item As Group In results
    Console.WriteLine("Line: {0}", item)
Next

C#版本

var sampleInput = "@delimabc@delim@delim123@delim@delim456@delim";
var results = Regex.Matches(sampleInput, "(?<=@delim)\\w+");

foreach (Group item in results) {
    Console.WriteLine("Line: {0}", item);
}

更新版本:

(?<=@delim)[^@].+?(?=@delim|$)

【讨论】:

  • 如何提取结果以匹配组?嵌套括号?
  • 我明白了,只需用 () 包裹 \w+ - @delim(.+?)@delim
  • @mservidio 我正在添加 .net 演示
  • 如果我想包含任何字符,使用 .+ 而不是 \w+ 是否仍然有效? IE:@ 符号可能在我想要捕获的字符串中。
  • 没关系,我明白你在说什么关于字符匹配集。
【解决方案2】:
@delim(.+?)@delim

试试这个 .Set g flag.Just 修改你的正则表达式以添加 ?.Grab the caotures.See demo.

http://regex101.com/r/uH3tP3/1

【讨论】:

    【解决方案3】:

    你可以在这个正则表达式上使用 split:

    (?:@delim)+
    

    RegEx Demo

    或者用一个空字符串替换给定的正则表达式模式。

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多