【问题标题】:Regex to match integers, decimals and fractions [duplicate]正则表达式匹配整数、小数和分数
【发布时间】:2014-01-29 21:47:52
【问题描述】:

我正在寻找一个可以匹配字符串中的整数、小数和分数的正则表达式:

这里有一些例子

11.325 x 55.65
11x13
11”x13”
11” x 13”
11 3/8 x 15 7/8 
11 3/8” x 15 7/8“

上面例子的解释:

  1. 两位小数
  2. 两个整数
  3. 带引号的两个整数表示英寸
  4. 同上,但有空格
  5. 两个整数后跟一个分数
  6. 与上述相同,在分数后加引号

到目前为止,我已经提出了可以匹配任何数值的代码,即整数和小数,但我被困在分数上。

Dim matches = Regex.Matches(curCellVal + "", "[\d.]+")

上面的代码给了我 6 个匹配 11 3/8” x 15 7/8“,我需要它给我 2 个。

我不擅长正则表达式,因此我们将不胜感激。

我的首选语言是 VB.net。

【问题讨论】:

  • 我有一种模糊的印象,人们不会欣赏你的问题。没有显示任何努力,格式很多,不清楚你想获得什么。
  • 我的建议:变得有能力。解决正则表达式问题的方法是非常仔细地描述您打算接受的“语言”——字符串集。与其写例子,不如写大量使用 OR 的英文描述。您想接受数字零,或任何非零数字后跟任意数量的数字,或任何数字后跟一个点,后跟一个或多个数字,或者...列出所有的情况.一旦你掌握了所有的情况,编写正则表达式就会容易得多。
  • Here you go 为你所经历的所有痛苦 :)
  • @boruchsiper 如何尝试根据您的特定情况调整您迄今为止获得的信息。我们不是来为您工作的。
  • @boruchsiper 你为什么不测试一下?它应该工作。我还在regexhero 上对其进行了测试,但由于我需要一个帐户来分享链接,所以我刚刚提供了另一个在线测试器。

标签: .net regex


【解决方案1】:

试一试:

(\d+[\/\d. ]*|\d)

http://regex101.com/r/oO9yI9

以后,我建议让您的问题更清楚,这样我们才能真正了解您想要做什么——提供输入、预期输出,并包含您正在使用的编程语言。

vb.net 是 PCRE 兼容的,所以你应该可以使用这个:

Dim regex As Regex = New Regex("(\d+[\/\d. ]*|\d)")
Dim match As Match = regex.Match("11.325 x 55.65")
If match.Success Then
    Console.WriteLine(match.Value)
    # this matches, so you'll get a value
End If

【讨论】:

    【解决方案2】:

    这个正则表达式应该可以工作:

    @"\d+(\.\d+|\s+\d+/\d+)?"
    

    这匹配任何一个或多个数字的序列,可选地后跟.,后跟一个或多个数字一个或多个空格字符的序列,后跟一个或多个数字,后跟 /,后跟一个或多个数字。

    例如:

    Dim inputs = New String() { _
        "11.325 x 55.65", _
        "11x13", _
        "11””x13””", _
        "11”” x 13””", _
        "11 3/8 x 15 7/8 ", _
        "11 3/8”” x 15 7/8““" }
    For Each input in inputs
        Console.Write(input + ": ")
        For Each match as Match in Regex.Matches(input, "\d+(\.\d+|\s+\d+/\d+)?")
            Console.Write(" (" + match.Value + ") ")
        Next
        Console.WriteLine()
    Next
    

    产生输出:

    11.325 x 55.65:  (11.325)  (55.65) 
    11x13:  (11)  (13) 
    11"x13":  (11)  (13) 
    11" x 13":  (11)  (13) 
    11 3/8 x 15 7/8 :  (11 3/8)  (15 7/8) 
    11 3/8" x 15 7/8":  (11 3/8)  (15 7/8) 
    

    【讨论】:

    • 您的答案的先前版本有效,但现在无效。这类似于@remus 答案中的表达式。无论如何都非常感谢!
    • @boruchsiper 我不明白你的意思。我在这个答案中唯一改变的是我打印结果的方式。
    • 我相信这是你在上一个答案\d+[\/\d. ]*\d中写的。也许是别人?
    • @boruchsiper 相同分数的答案可能是随机排序的,因此您可能正在查看其他答案。无论如何,如果您能告诉我为什么它不起作用,我很乐意纠正这个答案。
    • 哎呀,我的错,刚刚再次检查,它确实有效。我已经将答案授予@remus,但我投了你一票。
    猜你喜欢
    • 2021-07-20
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多