【问题标题】:Regex pattern for splitting a delimited string in curly braces用于在花括号中拆分分隔字符串的正则表达式模式
【发布时间】:2016-12-06 14:49:12
【问题描述】:

我有以下字符串

{token1;token2;token3@somewhere.com;...;tokenn}

我需要一个Regex 模式,它会给出字符串数组的结果,例如

token1
token2
token3@somewhere.com
...
...
...
tokenn

如果可以使用相同的模式来确认字符串的格式,也将不胜感激,这意味着字符串应该以花括号开始和结束,并且锚点中至少存在 2 个值。

【问题讨论】:

  • 什么是正则表达式?你用的是什么编程语言?
  • 大部分语言都支持split(";") ?
  • 我必须在 C# 中使用它
  • @PavneetSingh 请在结果示例下方查看我的 cmets :)
  • 好消息,在 C# 中,您可以使用正则表达式来做到这一点。为什么需要正则表达式,顺便说一句?您真的可以使用s.Trim(' ','}','{').Split(';'),然后检查数组中是否有 2 个或更多项目。见ideone.com/3D23m6

标签: c# arrays regex


【解决方案1】:

您可以使用带有命名重复捕获组的锚定正则表达式:

\A{(?<val>[^;]*)(?:;(?<val>[^;]*))+}\z

regex demo

  • \A - 字符串开头
  • { - 一个{
  • (?&lt;val&gt;[^;]*) - 组“val”捕获 0+(由于 * 量词,如果值不能为空,则使用 +)除 ; 以外的字符
  • (?:;(?&lt;val&gt;[^;]*))+ - 序列出现 1 次或多次(因此,{...} 内至少需要 2 个值):
    • ; - 分号
    • (?&lt;val&gt;[^;]*) - 组“val”捕获除; 之外的 0+ 个字符
  • } - 文字 }
  • \z - 字符串结束。

.NET 正则表达式将每个捕获保存在 CaptureCollection 堆栈中,这就是为什么在找到匹配项后可以访问捕获到“num”组中的所有值的原因。

C# demo:

var s = "{token1;token2;token3;...;tokenn}";
var pat = @"\A{(?<val>[^;]*)(?:;(?<val>[^;]*))+}\z";
var caps = new List<string>();
var result = Regex.Match(s, pat);
if (result.Success)
{
    caps = result.Groups["val"].Captures.Cast<Capture>().Select(t=>t.Value).ToList();
}

【讨论】:

  • 恐怕这行不通,你能粘贴 {Teddy;Bear;Giant;Gorilla} Lion 的拆分结果吗?有人删除了我粘贴该示例的答案(对此感到抱歉)
  • 顺便说一句,为了确保至少有2个值,我们不能使用像{2,}这样的量词
  • 运行良好。您不需要任何限制量词。我发布了从 CaptureCollection 获取值所需的代码。
  • 这是我使用该模式时遇到的异常:附加信息:解析“\A{(?[^;]*)(?:;(?[^;] *))+}\z" - 组名无效:组名必须以单词字符开头。啊抱歉,等等,我的错,没有注意到空格
  • 我不想只使用 Regex.Match 来确认输入字符串格式,而使用 Regex.Split 来直接获取数组。这甚至是可能的还是我在拐弯抹角? ;) 如果我必须进入显式循环,那么我永远不会问这个问题
【解决方案2】:

阅读它(类似于你的问题):How to keep the delimiters of Regex.Split?

对于您的RegEx 测试,请使用:http://www.regexlib.com/RETester.aspx?AspxAutoDetectCookieSupport=1

但是RegEx 是一个非常耗费资源、缓慢的操作。

在您的情况下,最好使用string 类的Split 方法,例如:"token1;token2;token3;...;tokenn".Split(';');。它会返回给你一个你想要获取的字符串集合。

【讨论】:

  • 拆分不会让验证字符串。
  • 您的结果示例保留先前集合的所有元素。您希望如何验证您收藏的元素?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多