C# 获取第二个非字母数字的索引
所以我正在尝试清理一些文本块。我认为C# 获取第二个非字母数字的索引,c#,regex,C#,Regex,所以我正在尝试清理一些文本块。我认为regex可能是一个不错的解决方案,而不是一堆ifstatement。但是,唉,我对正则表达式不太在行。所以我希望你们中的一些人会愿意帮助我 案例 我有不同的文本需要格式化 string one = "tbEmails"; string two = "dbo.tbEmails"; string three = "dbo.tbEmails,\n\t"; string four = "dbo.tbEmails."; 我想要的结果是 one = "tbEmails
regex
可能是一个不错的解决方案,而不是一堆if
statement。但是,唉,我对正则表达式不太在行。所以我希望你们中的一些人会愿意帮助我
案例
我有不同的文本需要格式化
string one = "tbEmails";
string two = "dbo.tbEmails";
string three = "dbo.tbEmails,\n\t";
string four = "dbo.tbEmails.";
我想要的结果是
one = "tbEmails";
two = "dbo.tbEmails";
three = "dbo.tbEmails";
four = "dbo.tbEmails";
我知道我可以通过使用
int index = new Regex("[^a-zA-Z ]").Match("dbo.tbEmails,\n\t").Index;
但是如何忽略正则表达式中的第一个
,并获取第二个非字母数字值的索引呢。另外,如果字符串中没有
,是否有方法返回第一个非字母数字值?基本上,要获得第n个匹配索引,只需使用Regex.Matches
查找所有匹配项,并检查是否可以访问具有必要索引的项,如果可以,从匹配对象获取所需的详细信息:
var index = -1;
var matches = Regex.Matches(str, @"[^a-zA-Z ]");
if (matches.Count > 1) // at least 2
{
index = matches[1].Index;
}
顺便说一句,非字母数字模式是[\W\u]
,字母数字模式是[^\W\u]
(或[\W-[\u]]
)
似乎还可以使用正则表达式替换操作来获得所需的结果
Regex.Replace(str, @"(?s)^([^\W_]+(?:[\W_][^\W_]+)?).*", "$1");
见
或更简单的匹配正则表达式:
var match = Regex.Match(str, @"^[^\W_]+(?:[\W_][^\W_]+)?");
if (match.Success)
{
Console.Write(match.Value);
}
详细信息:
-字符串的开头^
-1个或多个字母数字字符[^\W\u]+
-出现1次或0次:(?:[\W\u][^\W\u]+)?
-1个字符,而不是字母数字字符[\W\u]
-1个或多个字母数字字符[^\W\u]+
Regex.Replace(str,[^\\w]*$,”)代码>您可以使用此正则表达式直接获取匹配项:
string value = new Regex("[A-Za-z ]+(?:[^A-Za-z ][A-Za-z ]+)?").Match("dbo.tbEmails,\n\t").Value;
术语[A-Za-z]+
匹配所有[A-Za-z]字符,直到第一个非[A-Za-z]字符<代码>(?:[^A-Za-z][A-Za-z]+)
匹配第一个其他字符和所有[A-Za-z]字符,直到第二个其他字符。?
使第二部分有条件。您可以从匹配[1]
中获取所有匹配项和所需数据。但是,似乎您只需要Regex.Replace(str,@“(?s)^([^\W_]+(?:[\W_][^\W_]+)?).*,“$1”)代码>,请参阅。string.Trim()
?您似乎已经用一种更为复杂的方式向自己说明了问题,或者您给出了一个比您试图做的事情简单得多的示例。@Kir:一定是第一个,看到Wiktor的建议,我已经意识到解决方案是多么简单。令人惊讶的是,人们很容易忽略了解决方案;-)如果您有一组预定义的拆分字符,那么还可以使用:one=String.Join(“.”,one.split({'.','.},3.Take(2))代码>。这对你的样品有效。