如何匹配字符的第一个出现并将其拆分

时间:2018-09-05 06:34:12

标签: c# regex

我有一个文本文件,我想从中将KeysValues存储在String数组中。

在这种情况下,Key类似于“ 输入文件”,而Value则是“ 'D:\ myfile.wav' ”。我用**:**字符分割文本文件行。但是,我只想将拆分限制为仅**:**的第一次出现。

这是我的代码:

  

输入文件:'D:\ myfile.wav'

     

持续时间:00:00:18.57

if (Regex.IsMatch(line, @"[^0-9\p{L}:_ ]+", RegexOptions.IgnoreCase)) 
{
    string[] dataArray = line.Split(':');
}

5 个答案:

答案 0 :(得分:4)

使用正则表达式捕获

private static Regex _regex = new Regex(@"^([\p{L}_ ]+):?(.+)$");

....

Match match = _regex.Match(line);
if (match.Success)
{
    string key = match.Groups[1].Captures[0].Value;
    string value = match.Groups[2].Captures[0].Value;
}

regexp是静态成员,以避免每次使用时都对其进行编译。表达式中的?用于强制执行懒惰行为(默认为贪婪)并匹配第一个:

Link to Fiddle

编辑

在您发表评论后,我已经更新了代码并进行了改进。我认为这就是您的意思:

键:任何字母,下划线和空格组合(无数字) 价值:任何 键和值之间的分隔符::

答案 1 :(得分:2)

基本上,您不想拆分整个字符串,而是在遇到第一个':'char加一个符号(':'本身)之前跳过所有内容。

var data = line.Substring(line.IndexOf(':') + 1);

或者如果您真的想要使用Split解决方案:

var data = string.Join(":", line.Split(':').Skip(1));

在这里,我们首先将字符串拆分为数组,然后跳过一个元素(我们试图摆脱的一个元素),最后在数组中的元素之间构造一个带有':'的新字符串。

答案 2 :(得分:0)

这是使用正则表达式(代码注释)的一种方法:

  string[] lines = {@"Input File : 'D:\myfile.wav'", @"Duration: 00:00:18.57"};
  Regex regex = new Regex("^[^:]+");
  Dictionary<string, string> dict = new Dictionary<string, string>();

  for (int i = 0; i < lines.Length; i++)
  {
    // match in the string will be everything before first :,
    // then we replace match with empty string and remove first
    // character which will be :, and that will be the value
    string key = regex.Match(lines[i]).Value.Trim();
    string value = regex.Replace(lines[i], "").Remove(0, 1).Trim();
    dict.Add(key, value);
  }

它使用模式^[^:]+,这是一种否定类技术,可以匹配所有内容,除非指定了字符。

答案 3 :(得分:0)

通过这种方式,您可以读取文本文件的每一行。您用Key =填充json,直到“:” Value =从“:”

android {
    ...

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def formattedDate = new Date().format('yyMMdd')
            outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk"
        }
    }
}

答案 4 :(得分:0)

您需要将看跌期权信息读取到String Line 之后,执行此操作。

String Key = Line.Split( ':' )[0];
String Value = Text.Substring( Key.Length + 1, Text.Length - Property.Length - 1 );