匹配一个字符的正则表达式,但不包含在方括号中。

4

输入字符串:

[Wsg-Fs]-A-A-A-Cgbs-Sg7-[Wwg+s-Fs]-A-A-Afk-Cgbs-Sg7

期望的输出是一个字符串数组:
[Wsg-Fs] A A A Cgbs Sg7 [Wwg+s-Fs] A A Afk Cgbs Sg7

如果我使用 - 作为分隔符来拆分输入字符串,那么方括号内的字符串也会被拆分。
如何拆分字符串以忽略方括号中的 -
我能找到一些类似的帖子尝试忽略包含在引号中的分隔符,但我还没有能够将这些解决方案应用到我的问题上。
任何建议都将非常有帮助。谢谢!

本篇文章展示了如何处理带引号的CSV文件;我想它也可以用于方括号:http://www.kimgentes.com/worshiptech-web-tools-page/2008/10/14/regex-pattern-for-parsing-csv-files-with-embedded-commas-dou.html - Robert Harvey
2个回答

9
假设没有嵌套的方括号,您可以使用以下内容仅匹配方括号外的 - 字符:
-(?![^\[]*\])

示例:http://regex101.com/r/sX5hZ2

这里使用了负向先行断言,逻辑是如果在任何开放的方括号之前有一个关闭的方括号,则我们尝试匹配的 - 位于方括号内。


2
将此古老的问题重新提出,提供另一种解决方案,因为当前的解决方案仅检查分割符-后面没有跟随],这并不能保证它被括号包含。
\[[^\]]*\]|(-)

然后按照第一组进行分割(请参见 演示 右下方面板中的第一组捕获结果)
为了按照第一组进行分割,我们首先用某个独特的字符串(如SPLIT_HERE)替换第一组,然后按照 SPLIT_HERE 进行分割。
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main() {
string s1 = @"[Wsg-Fs]-A-A-A-Cgbs-Sg7-[Wwg+s-Fs]-A-A-Afk-Cgbs-Sg7";
var myRegex = new Regex(@"\[[^\]]*\]|(-)");
var group1Caps = new StringCollection();

string replaced = myRegex.Replace(s1, delegate(Match m) {
if (m.Groups[1].Value == "") return m.Groups[0].Value;
else return "SPLIT_HERE";
});

string[] splits = Regex.Split(replaced,"SPLIT_HERE");
foreach (string split in splits) Console.WriteLine(split);

Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();

} // END Main
} // END Program

这里是一个完整的可工作的在线演示参考 如何匹配除了s1、s2、s3之外的模式 如何匹配一个模式,除非...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接