编辑跳过“:”字符的正则表达式

时间:2016-11-23 11:38:27

标签: .net regex

我有这个字符串: 约翰·多伊(1/2) 我需要单独 John Doe 1 2 。 我有这个正则表达式:

([\w.-[\d]][\w.\s-[\d]]+)|([0-9]+)

但如果我有这种字符串: 约翰:Doe(1/2)

我希望 John:Doe 1 2 分开,我不想分开 John:Doe 即可。 我该怎么做?感谢。

2 个答案:

答案 0 :(得分:1)

:添加到第二个字符类以匹配它:

([\w.-[\d]][\w:.\s-[\d]]+)|([0-9]+)
              ^

请参阅regex demo

由于这种模式给SO观众带来了一些困难,所以这是它的解释:

  • ([\w.-[\d]][\w:.\s-[\d]]+) - 第1组捕获以下序列:
    • [\w.-[\d]] - 任何Unicode字母,下划线或.符号 - 但不是数字(因为它们会被-[\d]减去)
    • [\w:.\s-[\d]]+ - 一个或多个字母,可以是Unicode字母,:.,空白
  • | - 或
  • ([0-9]+) - 第2组捕获1个或多个ASCII数字

要仅将ASCII字母与正则表达式匹配,请使用RegexOptions.ECMAScript选项编译正则表达式。

答案 1 :(得分:0)

看起来你正试图将两个数字放在括号中,用斜线分隔,然后在那个位之前......这就是你需要定义你的正则表达式的方法。 (顺便说一句,正则表达式的语法可以有所不同,所以它会帮助你说出你需要的语言)我会去...

\(([0-9] +)/([0-9] +)\)

给你“$ 1”作为第一个数字,“$ 2”作为第二个数字,“$`”作为括号部分之前的所有内容。这是一个单元测试,演示将字符串拆分为3个值(在C#中,因为没有指定语言):

    [TestCase("John Doe(1/2)", "John Doe", "1", "2")]
    [TestCase("John : Doe (1/2)", "John : Doe ", "1", "2")]
    public void TextExamples(string example, string expectedPart1, string expectedPart2, string expectedPart3)
    {
        // Arrange.
        Regex threePartPattern = new Regex(@"\(([0-9]+)/([0-9]+)\)");

        // Act.
        Match threePartMatch = threePartPattern.Match(example);

        // Assert.
        Assert.That(threePartMatch.Success, Is.True);
        Assert.That(threePartMatch.Result("$`"), Is.EqualTo(expectedPart1));
        Assert.That(threePartMatch.Result("$1"), Is.EqualTo(expectedPart2));
        Assert.That(threePartMatch.Result("$2"), Is.EqualTo(expectedPart3));
    }