【问题标题】:C# Regex split() without removing the split condition characterC# Regex split() 不删除拆分条件字符
【发布时间】:2017-11-15 13:41:30
【问题描述】:

我正在使用其Split() 方法将string 与正则表达式分开。

var splitRegex = new Regex(@"[\s|{]");

string input = "/Tests/ShowMessage { 'Text': 'foo' }";

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }";

string[] splittedText = splitRegex.Split(input, 2);

string 只是输入的示例模式。 input 有两种不同的结构,一种是在{ 之前有一个空格,一种是没有空格。我想在{ 括号上拆分input 以获得以下结果:

  • /Tests/ShowMessage
  • { '文本': 'foo' }

如果有空格,则字符串会在那里拆分(空格被删除),我会得到我想要的结果。但是如果没有空格,我会在{ 上拆分字符串,所以{ 会被删除,但我不想要什么。如何在不删除拆分条件字符的情况下使用Regex.Split()

【问题讨论】:

标签: c# regex string split


【解决方案1】:

方括号创建一个字符集,因此您希望它与这些内部字符之一完全匹配。为了您的愿望,从删除它们开始。

所以要匹配它随机计数个空格,你必须添加*,结果是这个\s*

  • \s 是一个空格
  • * 表示零个或多个

如果不删除拆分条件字符,可以使用前瞻断言(?=...)

  • (?=...)(?!...) 是前瞻断言

Regex 的组合如下所示:\s*(?={)

This 是所有不同Regex 部分的非常好的详细文档,您可以看看它。此外,您可以轻松免费地测试您的Regexhere

【讨论】:

    【解决方案2】:

    为了不在匹配中包含花括号,您可以将其放入前瞻中

    \s*(?={)
    

    这将匹配任意数量的空格,直到打开花括号之前的位置。

    【讨论】:

    • 正是我想要的。但是[ ] 如何影响我的正则表达式?在这种特定情况下不明白。
    • 由于管道字符,这不会过度拆分字符串吗?
    • @L.Guthardt 方括号用于创建字符集。所以[\s|{] 实际上会匹配管道字符或大括号中的任何空格。
    • @juharr 我在问,因为我尝试了带括号 [\s*(?={)] 的代码,它再次删除了 {。如果它匹配大括号之前的位置,为什么?
    • @L.Guthardt 方括号再次用于字符集,因此您要求它匹配其中的一个字符,除了\s,它们失去了特殊含义。
    【解决方案3】:

    您可以在“{”上使用常规字符串拆分并修剪空格:

    var bits = "/Tests/ShowMessage { 'Text': 'foo' }".Split("{", StringSplitOptions.RemoveEmptyEntries);
    bits[0] = bits[0].TrimEnd();
    bits[1] = "{" + bits[1];
    

    如果你想使用 RegEx 路由,你可以添加 { 如果你稍微改变一下正则表达式:

    var splitRegex = new Regex(@"\s*{");
    
    string input = "/Tests/ShowMessage { 'Text': 'foo' }";
    
    //second version of the input: 
    //string input = "/Tests/ShowMessage{ 'Text': 'foo' }";
    
    string[] splittedText = splitRegex.Split(input, 2);
    splittedText[1] = "{" + splittedText[1];
    

    这意味着“在出现(零个或多个空格后跟 {)时拆分”-因此拆分操作会破坏您的空格(您想要)和您的 {(您不想要),但您可以将 { 放回去确定这将意味着你得到你想要的

    【讨论】:

    • 是的,可以将其添加回去或​​采用默认的string.split 方式并产生我的结果,但这不是我想要的。它比我展示的要复杂,只是一些简单的示例。
    【解决方案4】:
    var splitedList = srt.Text.Replace(".", ".#").Replace("?", "?#").Replace("!", "!#").Split(new[] { "#"}, StringSplitOptions.RemoveEmptyEntries).ToList();
    

    这会将文本拆分为 .!?并且不会删除条件字符。为了获得更好的结果,只需将 # 替换为一些 uniq char。比如这个'®'就是这样。很简单。由于许多不同的任务标准等,没有 regex.split 缓慢而困难......

    passing-> “你好。我是开发者!”

    结果(拆分条件字符存在)

    1. “你好。”
    2. “我是开发者!”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多