特定子串的长度
Posted
技术标签:
【中文标题】特定子串的长度【英文标题】:Length of specific substring 【发布时间】:2012-06-07 13:35:58 【问题描述】:我检查我的字符串是否以数字开头使用
if(RegEx(IsMatch(myString, @"\d+"))) ...
如果这个条件成立,我想得到我的字符串开头的这个“数字”子字符串的长度。
如果每个下一个字符都是从第一个字符开始并增加一些计数器的数字,我可以找到长度检查。有没有更好的方法来做到这一点?
【问题讨论】:
你能假设“数字”子字符串后面的字符吗?例如,字符串是否总是类似于:1234abc,或者这可能是:12345 之后没有字符? @ademing2,嗯,这是一个数学表达式,但你永远无法确定用户输入是否正确)) 【参考方案1】:你应该找到匹配项,而不是使用IsMatch
:
// Presumably you'll be using the same regular expression every time, so
// we might as well just create it once...
private static readonly Regex Digits = new Regex(@"\d+");
...
Match match = Digits.Match(text);
if (match.Success)
string value = match.Value;
// Take the length or whatever
请注意,此不检查数字是否出现在字符串的开头。您可以使用@"^\d+"
来做到这一点,这会将匹配锚定到开头。或者,如果您愿意,可以检查 match.Index
是否为 0...
【讨论】:
【参考方案2】:要检查我的字符串是否以数字开头,您需要使用模式^\d+
。
string pattern = @"^\d+";
MatchCollection mc = Regex.Matches(myString, pattern);
if(mc.Count > 0)
Console.WriteLine(mc[0].Value.Length);
【讨论】:
+1 MatchCollection 似乎比 Match 更安全。然后就可以得到所有值中长度最大的字符串了。 @ademing2:在贪心匹配的情况下,您希望从字符串的开头开始有多少匹配? @user1215106:但增加了即时需求的复杂性。考虑到单个匹配的要求,我仍然认为使用 Match 更适合当前的要求。 @JonSkeet - 如果myString
是多行输入怎么办?
@user1215106:那么我们需要知道需求是什么。但你似乎让事情变得更复杂,却没有任何迹象表明我们需要让它们变得复杂。【参考方案3】:
您的正则表达式检查您的字符串是否包含一个或多个数字的序列。如果要检查它是否以它开头,则需要在开头锚定它:
Match m = Regex.Match(myString, @"^\d+");
if (m.Success)
int length = m.Length;
【讨论】:
【参考方案4】:作为正则表达式的替代方法,您可以使用扩展方法:
int cnt = myString.TakeWhile(Char.IsDigit).Count();
如果字符串的开头没有数字,您自然会得到零计数。否则你有位数。
【讨论】:
【参考方案5】:不要只检查IsMatch
,而是获取匹配项,以便获取有关它的信息,例如长度:
var match = Regex.Match(myString, @"^\d+");
if (match.Success)
int count = match.Length;
另外,我在模式的开头添加了一个^
,以将其限制在字符串的开头。
【讨论】:
【参考方案6】:如果您对代码进行更多分解,您可以利用Regex.Match:
var length = 0;
var myString = "123432nonNumeric";
var match = Regex.Match(myString, @"\d+");
if(match.Success)
length = match.Value.Length;
【讨论】:
以上是关于特定子串的长度的主要内容,如果未能解决你的问题,请参考以下文章