【问题标题】:C# regular expressions. Get nth occurrenceC# 正则表达式。获得第 n 次出现
【发布时间】:2013-10-02 19:47:29
【问题描述】:

嗨,我正在尝试使用 regx 拆分字符串。如何获得第 n 次出现的模式以便将其分配给字符串?

var myString = "1.2.300.4";
var pattern = new Regex(@"([0-9]+)");

var major = pattern.Occurrence(1); //first occurrence
var minor = pattern.Occurrence(2) //second occurrence
var build = pattern.Occurrence(3) //third occurrence
var revision = pattern.Occurrence(4) // forth occurrence

类似的东西,但在正则表达式中。

有没有办法选择正则表达式模式本身的出现? 例如;

var major = new Regex(@"([0-9]+)$1");
var minor = new Regex(@"([0-9]+)$2");
var build = new Regex(@"([0-9]+)$3");
var revision = new Regex(@"([0-9]+)$4");

【问题讨论】:

  • 为什么不myString.Split('.') 并以字符串形式返回一个数组。
  • 您也可以只使用System.Version 类为您解析。
  • @Habib。 string.split 以前曾在我的脑海中闪过,但正如你现在所说的,我可以看到它是如何工作的。谢谢。
  • 请将您的答案转换为实际答案。答案不应嵌入问题中(它破坏了 Stack Exchange 模型)。

标签: c# regex


【解决方案1】:

您可以使用Match 查找第一个,然后在每个匹配项上使用NextMatch 查找下一个。

var major = pattern.Match(myString);
var minor = major.NextMatch();
var build = minor.NextMatch();
var revision = build.NextMatch();

如果您不想懒惰地迭代匹配项,您可以使用Matches 解析整个字符串,然后按索引获取匹配项(如果需要):

var allmatches = pattern.Matches(myString);
var major = allmatches[0];
//...

【讨论】:

  • 感谢您的回答。这与我正在寻找的内容很接近并且有效。
  • 那么有没有办法在正则表达式模式中进行匹配?我编辑了我的例如。上面显示我的意思。
  • @user2820801 这基本上是第二个例子,假设你急切地解析整个事情没有问题。
【解决方案2】:

你可以使用String.Split这样的方法;

var myString = "1.2.300.4";
var array = myString.Split(new char[] {'.'}, StringSplitOptions.RemoveEmptyEntries);
foreach (var element in array)
{
    Console.WriteLine (element);
}

输出将是;

1
2
300
4

这里是 DEMO.

作为替代方案,在某些情况下使用System.Version 可能是更好的选择。喜欢;

Version v = new Version("1.2.300.4");
Console.WriteLine (v.Major);
Console.WriteLine (v.Minor);
Console.WriteLine (v.Build);
Console.WriteLine (v.Revision);

输出将是;

1
2
300
4

【讨论】:

  • 如果字符串有 100 个匹配项而他只想要前 5 个呢?这会急切地解析整个事情。
  • @Servy 你是完全正确的,但 OP 没有提到这种巨大的匹配 :)
【解决方案3】:

使用string.Split('.').

结果将是一个数组。

var myString = "1.2.300.4";
var myResults = myString.Split('.');

var major = myResults[0]; //first occurrence
var minor = myResults[1]; //second occurrence
var build = myResults[2]; //third occurrence
var revision = myResults[3]; // forth occurrence

【讨论】:

  • 是的,这就是我首先所做的,谢谢。但我正在学习正则表达式,并想用正则表达式来做。
  • 如果字符串更长并且有更多'.',这将是最有用的答案,并且您只想获得出现的子集。
  • @user2820801 谢谢。根据您的评论“我如何获得第 n 场”,我认为您可能只想要第 3 场或第 7 场比赛,而不是全部连续。
【解决方案4】:
var version = Version.Parse("1.2.300.4");

var major = version.Major;
var minor = version.Minor;
var build = version.Build;
var revision = version.Revision;

【讨论】:

  • 哇,谢谢。将来在编写关于表单的代码时会很有帮助。
【解决方案5】:

已解决...

这与我使用正则表达式的想法很接近。它适用于任何已知长度的字符串。

var myString = "1.2.300.4.50.6000.70";
var pattern = new Regex(@"([0-9]+)");
var match = pattern.Matches(myString);

var secondOccurrence = match[1]; // 2
var fifthOccurrence = match[5];  // 6000

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多