【问题标题】:Regex - Match everything except specified characters or split the string [duplicate]正则表达式 - 匹配除指定字符以外的所有内容或拆分字符串 [重复]
【发布时间】:2022-01-18 11:36:59
【问题描述】:

我正在使用这个匹配非逗号组的正则表达式 [^,]+,但它也需要对字符 ;\nempty space 执行此操作。

我有这个字符串12f3,, 456;;;;\n\n227- , 999,我需要从中获取所有子字符串,例如12f3456227-999

有没有办法匹配除某些指定字符之外的所有内容,或者在这种情况下最好使用拆分?

【问题讨论】:

  • 所以将它们添加到正则表达式中,/[^\s;,]+/g
  • @WiktorStribiżew For \s 我得到'无法识别的转义序列'
  • 所以你使用的是旧版本的Java,对吧?还是你用 C# 编码?
  • @WiktorStribiżew C#
  • 然后使用@"[^\s;,]+",更多细节和演示见答案。

标签: c# regex


【解决方案1】:

您可以使用[^\s;,]+ 模式匹配这些子字符串。不建议使用[\s;,]+ 进行拆分,因为拆分后的结果数组中通常存在空字符串(由于字符串开头/结尾处的匹配,或连续匹配)。

请参阅regex demo

在 C# 中,使用

var matches = Regex.Matches(text, @"[^\s;,]+")
    .Cast<Match>()
    .Select(x => x.Value)
    .ToList();

[^\s;,]+ 匹配一个或多个(由于 + 量词)出现的任何字符,而不是([^...] 是一个 否定 字符类)空格 (\s),分号加逗号。

非正则表达式方法

您可以用逗号和分号分割字符串,删除空条目,然后修剪结果数组中的字符串:

var text = "12f3,,   456;;;;\n\n227-   ,    999";
var res = text.Split(new[] {";", ","}, StringSplitOptions.RemoveEmptyEntries)
    .Select(x => x.Trim());
Console.WriteLine(string.Join("\n", res));

请参阅C# demo。输出:

12f3
456
227-
999

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多