【问题标题】:Regex C#- Everything Before, Between and After [T][/T]正则表达式 C#- 之前、之间和之后的所有内容 [T][/T]
【发布时间】:2016-11-02 02:51:27
【问题描述】:

我有这个正则表达式

([\s\S]*?)\[T\]([\s\S]*?)\[\/T\]([\s\s]*?)

这应该提取[T][\T] 之前、之间和之后的所有内容,但我总是让第三个捕获组为空。

我的文字是:

<h1>HelloWorld</h1>
[T]
 <h2>I'm Inside</h2
[/T]
<h1>HelloWorld</h1>
[T]
 <h2>I'm Inside</h2
[/T]
<h3>By World</h3>

我使用了RegexrRegex101 并得出的结论是错误出在最后一个捕获组([\s\S]*?) 上的? 中,因为正在做* 懒惰。但是,如果我删除它,它会将所有内容分组为一个匹配而不是两个。

编辑:

基本上我想做类似的事情

var template = @"    <h1>HelloWorld</h1>
    [T]
     <h2>I'm Inside</h2
    [/T]
    <h1>HelloWorld</h1>
    [T]
     <h2>I'm Inside</h2
    [/T]
    <h3>By World</h3>";

var regex = new Regex("([\s\S]*?)\[T\]([\s\S]*?)\[\/T\]([\s\s]*?)");
var finalString = regex.Replace(template,"$1 ; $2 ; $3");

// finalString = HelloWorld ; I'm Inside ; By World //

任何帮助表示赞赏。

【问题讨论】:

  • 你能指定(更具体地)期望的结果是什么吗?因为据我所知,这个正则表达式选择了除最后一行之外的所有内容(包括 [T] 和 [/T] 标签)。
  • 准备好了,进行了编辑,是的,这很简单。我想选择所有发生错误的地方,包括最后一行。
  • 您的问题不太清楚,因为您正试图捕获标签内的文本,并输出没有标签的文本 - 1 次通过是不可能的。 h2 标签没有用 &gt; 关闭 - 这真的是你所拥有的吗? [\s\s] 没有意义,它等于\s。目前只能推荐ideone.com/upIXLR,请查看更新。
  • 对不起,我的错是\s\S

标签: c# regex parsing


【解决方案1】:

由于您的问题标题与实际输出示例存在争议,因此我的回答是基于实际所需的输出。

要获得所需的输出,您必须查看给定文本中的模式。您要捕获的文本总是在 [T][/T] 之间。但它总是在>...

之间

基于这个逻辑,我为你做了一个例子:

Regex reg = new Regex(@"(?<=\>).+?(?=\<)");

var matches = reg.Matches(content);

// get distinct result
var result = matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();

StringBuilder builder = new StringBuilder();

// build the string
foreach (var item in result)
{
    builder.Append(item).Append(" ; ");
}

// remove last added " ; "
builder.Length = builder.Length - 3;

// builder now equals "HelloWorld ; I'm Inside ; By World"
Console.WriteLine(builder);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多