【问题标题】:Regex to match a string NOT in brackets正则表达式匹配不在括号中的字符串
【发布时间】:2014-01-06 19:59:26
【问题描述】:

我的配置是[HEADER].{3}$[.FOOTER]

我需要阅读此配置并准备一个二维数组,其中 [] 之间的字符串是值,而没有 [] 的字符串是要应用的正则表达式。

如何拆分上面的字符串来得到这个数组。

想法是:

IsRegEx Value
0       [HEADER]
1       .{3}$
0       [.FOOTER]

这样我就可以将正则表达式应用于index-1th 值并将数组连接回结果字符串。

我尝试过使用

string input = "[HEADER].{3}$[.FOOTER]";
char[] delimiterChars = { '[', ']'};
string[] words = input.Split(delimiterChars);

但这会删除 [] 并且没有办法区分给定字符串中的实际值和正则表达式模式。

如果拆分器是.,;string[] parts = Regex.Split(input , @"(?<=[.,;])") 可能会起作用

【问题讨论】:

  • [HEADER].{3}$[.FOOTER] 是正则表达式还是您的真实输入字符串?
  • 它是一个输入字符串,其中 .{3}$ 是一个需要应用于标题的正则表达式。基本上 [] 之间的任何内容都是一个值,而其余部分是一个正则表达式。
  • 但是如果你的字符串是[HEADER][A-Z]{3}$[.FOOTER],你怎么知道哪个部分是正则表达式呢?

标签: c# regex


【解决方案1】:

您可以使用此示例:

    string input = "[HEADER].{3}$[.FOOTER]";
Regex rx = new Regex(@"(?<header>\[.*\])(?<body>.*)(?<footer>\[.*\])");
Match m = rx.Match( input );

然后用

收集组内容
m.Groups[ "header" ]
m.Groups[ "body" ]
m.Groups[ "footer" ]

* 编辑 * 对于多个实例,你可以试试这个

  string input =  "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]";
  Regex rx = new Regex(@"\G(?<header>\[[^]]*?\])(?<body>[^[]*?)(?<footer>\[[^]]*?\])", RegexOptions.Multiline);
  Match m = rx.Match( input );      
  while( m.Success )
  {
    m = m.NextMatch();
  }

【讨论】:

  • 如果字符串限制为 3 个组,那肯定会起作用。我的输入可能是 [HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]
  • 如果我只想通过两种类型解析它怎么办。价值或模式。带 [] 的一个是值,另一个是模式。因为这将更可重用。像这样说:“[value].{3}$[.value][.value].{2}$[.value]”;
  • 好吧,您可以从组定义中提取 '[' & ']',因此它们不包含在组值中,使用此 Regex rx = new Regex(@"\G[( ?
    [^]]*?)](?[^[]*?)[(?
    [^]]*?)]", RegexOptions.Multiline);
  • 如果我有 "[HEADER].{3}$" 作为输入,这些正则表达式不起作用。它只返回标题而不返回正文。
【解决方案2】:

此正则表达式将找到任意数量的页眉和页脚值(假设您没有任何太复杂的东西,例如嵌套或转义括号):

var input = "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]";
var headersAndFooters = Regex.Matches(input, @"\[.*?\]");

然后您可以使用匹配项的索引和长度来计算中间的内容(例如,在上面的示例中,从 8 到 13 的间隙是第一个正则表达式),或者这个正则表达式:

var regexes = Regex.Matches(input, @"(?<=(\]|^))[^\]]+?(?=\[|$)");

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 2023-03-04
    • 2023-03-15
    • 2019-01-05
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多