从这个字符串中提取数字部分的最佳方法是什么?我查看了正则表达式,但它们把我搞糊涂了。子字符串可以吗?
/store/457987680928164?id=2
我需要的只是数字。
RegEx 是解决此问题的好方法,但如果您打算使用 SubString...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string test = "/store/457987680928164?id=2";
int start = test.IndexOfAny("0123456789".ToCharArray());
int end = test.IndexOf("?");
Console.WriteLine(test.Substring(start, end - start));
Console.ReadLine();
}
}
}
我想出了这些扩展方法来简化常见的字符串解析任务:
private static string Substring(string str, string value, bool isLastValue, bool isAfterValue, StringComparison comparisonType, string defaultValue)
{
int pos = isLastValue ? str.LastIndexOf(value, comparisonType) : str.IndexOf(value, comparisonType);
if (pos == -1) return defaultValue;
return isAfterValue ? str.Substring(pos + value.Length) : str.Substring(0, pos);
}
public static string SubstringBeforeFirst(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
{
return Substring(str, value, false, false, comparisonType, defaultValue);
}
public static string SubstringBeforeLast(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
{
return Substring(str, value, true, false, comparisonType, defaultValue);
}
public static string SubstringAfterFirst(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
{
return Substring(str, value, false, true, comparisonType, defaultValue);
}
public static string SubstringAfterLast(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
{
return Substring(str, value, true, true, comparisonType, defaultValue);
}
至于从您的示例中获取数字:
string s = "/store/457987680928164?id=2";
string number = s.SubstringAfterLast("/").SubstringBeforeFirst("?");
YARS(又一个正则表达式解决方案)
以下:
var str = "/store/457987680928164?id=2";
var regex = new Regex(@"\d+");
foreach (Match match in regex.Matches(str))
{
Console.WriteLine(match.Value);
}
输出这个:
457987680928164
2
我更喜欢正则表达式,这不是在我的示例中使用子字符串的运行速度比它快
static long GrabFirstLongFromString(string input)
{
string intAsString = String.Empty;
bool startedInt = false;
foreach(char c in input)
{
if (Char.IsDigit(c))
{
startedInt = true; //really only care about the first digit
intAsString += c;
}
else if (startedInt)
return long.Parse(intAsString);
}
return -1; //define a default, since this only does a 0 or positive I picked a negative
}
这是用正则表达式完成的
private static Regex digitsOnly = new Regex(@"[^\d]");
public static string RemoveNonNumbers(string input)
{
return digitsOnly.Replace(input, "");
}
或者只是简单的正则表达式:
Regex r = new Regex(@"\d+");
MatchCollection m = r.Matches("/store/457987680928164?id=2");
if (m.Count > 0)
{
Console.WriteLine(string.Format("Big number: {0} - Little number: {1}", m[0], m[1]));
}
以上打印:
Big number: 457987680928164 - Little number: 2
您应该获得 RadExpression Designer 并使用备忘单自学 RegEx。
如果 RegEx 让您感到害怕,只需在循环中执行它通常会更快:
string s = "/store/457987680928164?id=2";
string numericInput = string.Empty;
foreach(char c in s)
{
if (char.IsDigit(c))
numericInput += c;
}
我肯定会推荐为此使用 RegEx。字符串模式匹配和提取确实是正则表达式的理想场景。
这是一个正则表达式,它将匹配您提供的字符串示例,并为字符串的数字部分捕获括号:
^/store/(\d+)\?id=(\d+)
您可以在Regex Tester中验证它。我使用您的示例字符串和我上面写的正则表达式对其进行了测试。
string str = "/store/457987680928164?id=2";
string num = new string(str.Remove(str.IndexOf("?")).Where(a => char.IsDigit(a)).ToArray());