繁体   English   中英

用于匹配字符的正则表达式,但不包括在方括号中

[英]Regex for matching a character, but not when it's enclosed in square bracket

输入字符串:

[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

如果我用-作为分隔符拆分输入字符串,方括号内的字符串也会被拆分。

我该如何分割字符串这样-方括号内应该被忽略?

我可以找到一些类似的帖子试图忽略引号中的分隔符,但是我无法将这些解决方案应用于我的问题。

任何建议都会非常有用。 谢谢!

假设没有嵌套的方括号,您可以使用以下内容仅匹配-方括号外的字符:

-(?![^\[]*\])

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

这使用一负先行,与逻辑,如果有任何打开方括号前右方括号,则-我们试图匹配是括号内。

恢复这个古老的问题以提供另一种解决方案,因为当前只检查分裂-后面没有a ] ,这不能保证它被括在括号中。

\[[^\]]*\]|(-)

然后拆分第1组(参见演示组右下方面板中的第1组捕获)

要拆分第1组,我们首先用不同的东西替换第1组,例如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

除非......如何匹配模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM