【问题标题】:Extract some numbers and decimals from a string从字符串中提取一些数字和小数
【发布时间】:2013-08-22 11:45:02
【问题描述】:

我有一个字符串:

"   a.1.2.3 #4567   "

我想将其缩减为“1.2.3”。

目前使用 Substring() 和 Remove(),但如果在井号后面有更多数字,则会中断。

执行此操作的最佳方法是什么?我已经阅读了一堆关于 regex 和 string.split 的问题,但我无法得到任何我尝试在 VB.net 中工作的东西。我是否必须进行匹配然后使用匹配结果替换?

任何帮助将不胜感激。

【问题讨论】:

  • 您能否提供一个解释,帮助我们了解“1.2.3”在什么基础上是原始字符串的正确输出?
  • 您到底尝试了什么?使用正则表达式从该字符串中获取number.number.number 似乎并不难?
  • @Tormod 该字符串中的字母数字都不是文字,它可能是“z.4.4.4 #666”。我想要得到的只是原始字符串中的 d\.\d\.\d 。不知道这是否能回答你的问题,这里已经很晚了。
  • @ronald 以及在 Match 中使用 \d\.\d\.\d 有什么问题?
  • @m.buettner 我尝试使用示例here 作为基础,但由于某种原因它返回了一个空值。

标签: c# wpf regex vb.net


【解决方案1】:

这应该可行:

string input = "   a.1.2.3 #4567   ";
int poundIndex = input.IndexOf("#");
if(poundIndex >= 0)
{
    string relevantPart = input.Substring(0, poundIndex).Trim();
    IEnumerable<Char> numPart = relevantPart.SkipWhile(c => !Char.IsDigit(c));
    string result = new string(numPart.ToArray());
}

Demo

【讨论】:

  • +1 因为演示位很棒(代码也很好):)
  • 效果很好。再次感谢您花时间写出来。
【解决方案2】:

试试这个...

String[] splited = split("#");
String output = splited[0].subString(2); // 1 is the index of the "." after "a" considering there are no blank spaces before it..  

【讨论】:

    【解决方案3】:

    这是正则表达式的方法

     string input = "   a.1.2.3 #4567   ";
     Regex regex = new Regex(@"(\d\.)+\d");
     var match = regex.Match(input);
     if(match.Success)
     {
         string output = match.Groups[0].Value;//"1.2.3"
         //Or
         string output = match.Value;//"1.2.3"
     }
    

    【讨论】:

    • 或者只是match.Value
    • 您的解决方案也很好用,谢谢。不确定什么是最好的,所以我将我尝试的第一个标记为已接受。如果你们觉得应该选择更好的选择,请告诉我。
    • 即使字符串中没有 # 字符,我的解决方案也应该可以工作,而其他解决方案无法做到这一点,您可以根据自己的需要选择一个。
    【解决方案4】:

    如果井号是最相关的位,请依赖Split。示例 VB.NET 代码:

    Dim inputString As String = "   a.1.2.3 #4567  "
    If (inputString.Contains("#")) Then
        Dim firstBit As String = inputString.Split("#")(0).Trim()
        Dim headingToRemove As String = "a."
        Dim result As String = firstBit.Substring(headingToRemove.Length, firstBit.Length - headingToRemove.Length)
    End If
    

    既然这是一个多语言问题,这里是 C# 的翻译:

    string inputString = "   a.1.2.3 #4567  ";
    if (inputString.Contains("#"))
    {
        string firstBit = inputString.Split('#')[0].Trim();
        string headingToRemove = "a.";
        string result = firstBit.Substring(headingToRemove.Length, firstBit.Length - headingToRemove.Length);
    }
    

    【讨论】:

      【解决方案5】:

      我猜是另一种使用展开的方式

       \d+ (?: \. \d+ )+
      

      【讨论】:

      • 我建议向 OP 提供更多详细信息,说明他将如何使用您的答案。一个代码 sn-p 会很有帮助。
      • 我猜我会得到与使用 Sriram 表达式相同的结果,除了它能够匹配并返回,比如“11.22.3.444444”,而不仅仅是“1.2.3” “?
      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多