0

我有一个数据字段,其中包含两种格式的大量数字:

553000.468...705.46.0000000        <- Format 1
553000.469.5501000.704.47.0000000  <- Format 2

我只需要中间的三个数字,包括 703、704 或 705

我可以通过使用正则表达式来提取这些数字,如下所示:

Regex num = new Regex(@"(?<number>7\d+) ?");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(num.Match(numb).Result("${number}")); 

但是,只有在中间数字前面没有 7 时才有效

在我看来,处理它的最佳方法是关注“。”。问题是我不知道如何匹配“。”之后的字符。我可以拉出第一个“。”之前的数字。通过做这个:

Regex num = new Regex(@"(?<number>.\d+) ?");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(num.Match(numb).Result("${number}")); 

这将给我期间之前的一切。我正在使用此处找到的备忘单,但它没有显示如何匹配“。”之后的字符。如果我能弄清楚如何做到这一点,那么我可以重复这个模式,直到我得到我需要的数字,然后我可以使用上面的代码来摆脱之后的数字。这可能不是最有效的方法,但我以前从未使用过正则表达式,老实说,我觉得它很混乱。

编辑:

我被告知我需要提供更多示例或更好地解释它。我有一个数据库表,其中有一列名为 Glsec。该字段包含两种格式的数字;553000.468...705.46.0000000 和 553000.469.5501000.704.47.0000000 是这两种格式的示例。

在 553000.468...705.46.0000000 格式中,我只需要在...之后的第一组数字中找到的数字 703、704 或 705(左起第 14 个字符)

在 553000.469.5501000.704.47.0000000 格式中,我只需要从左侧算起的第 4 组数字(第 20 个字符)中的数字 703、704 或 705。

三组中的数字可能包含 000 到 999 之间的任何数字,但我只需要这三个数字。703、704、705 也有可能随机出现在其他数字组中,所以我必须确保我从正确的位置抓取数字。

我希望这能更好地解释它。

4

7 回答 7

5

在?上使用Split()方法 .然后你可以得到你想要的数字,如果它总是有相同的位置,或者你可以循环遍历数组来找到你想要的数字。

于 2012-06-14T15:28:49.820 回答
3

我只需要中间的三个数字,包括 703、704 或 705

你可以使用这个:

@"\.(70[3-5])\."

如果这些是唯一有效的值。

顺便说一句,谁说regex是解决您问题的最佳方法?

于 2012-06-14T15:25:13.877 回答
2

用于String.Contains测试三种情况。假设字符串是变量s

s.Contains(".705.")
s.Contains(".706.")
s.Contains(".707.")
于 2012-06-14T15:36:55.913 回答
1

如果你厌倦了正则表达式......

    string[] formats = new[] {"553000.468...705.46.0000000", "553000.469.5501000.704.47.0000000"};
    var results = from format in formats
                  from sub in format.Split('.')
                  where new[] { "703","704","705" }.Contains(sub)
                  select sub;
于 2012-06-14T15:48:09.517 回答
1

您需要将句点转义为\.,因为.在正则表达式中表示“任何字符”。

您可以在所需数字之前匹配特定数量的可选数字 + 句点:

Regex num = new Regex(@"^(?:\d*\.){3}(?<number>\d+)");

或之后:

Regex num = new Regex(@"(?<number>\d+)(?:\.\d*){2}$");
于 2012-06-14T15:31:52.117 回答
1

分两步做怎么样。首先,找到两个中间有三个数字的句点。然后,修剪周期。

Regex num = new Regex(@"\.\d{3}\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Value.Trim('.')); 

您还可以捕获匹配的子集:

Regex num = new Regex(@"\.(\d{3})\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Groups[1].Value); 
于 2012-06-14T15:29:18.697 回答
1

这 。是正则表达式的元字符,因此需要对其进行转义。以7开头的数字总是3位数吗?

您可以尝试以下方法:

   Regex num = new Regex(@"(?\.<number>\d+) ?");
   Match number = num.Match(numb);
   if (number.Success)
        Console.WriteLine(num.Match(numb).Result("${number}")); 
于 2012-06-14T15:29:46.403 回答