我有这个字符串: 约翰·多伊(1/2) 我需要单独 John Doe , 1 和 2 。 我有这个正则表达式:
([\w.-[\d]][\w.\s-[\d]]+)|([0-9]+)
但如果我有这种字符串: 约翰:Doe(1/2)
我希望 John:Doe 和 1 和 2 分开,我不想分开 John:Doe 即可。 我该怎么做?感谢。
答案 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));
}