获取第二个非字母数字的索引

时间:2016-11-17 13:06:48

标签: c# regex

所以我正在尝试清理一些文本块。我认为regex可能是一个很好的解决方案,而不是拥有一堆if州。但是,我对正则表达式的表达方式不太好。所以我希望你们中的一些人愿意帮助我。

案例 我有不同的文本需要格式化

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;

但是如何忽略正则表达式中的第一个.并获取第二个非字母数字值的索引。作为奖励:如果字符串中没有.,有没有办法返回第一个非字母数字值?

3 个答案:

答案 0 :(得分:2)

基本上,要获得第N个匹配索引,只需使用Regex.Matches查找所有匹配项并检查是否可以访问具有必要索引的项目,如果是,则从Match对象获取所需的详细信息:

var index = -1; 
var matches = Regex.Matches(str, @"[^a-zA-Z ]");
if (matches.Count > 1)  // at least 2
{
    index = matches[1].Index;
}

BTW,非字母数字模式为[\W_],字母数字为[^\W_](或[\w-[_]])。

您似乎也可以使用正则表达式替换操作来获取您使用

搜索的结果
Regex.Replace(str, @"(?s)^([^\W_]+(?:[\W_][^\W_]+)?).*", "$1");

请参阅regex demo

或者更简单的匹配正则表达式:

var match = Regex.Match(str, @"^[^\W_]+(?:[\W_][^\W_]+)?");
if (match.Success) 
{
    Console.Write(match.Value);
}

<强>详情:

  • ^ - 字符串开头
  • [^\W_]+ - 一个或多个字母数字字符
  • (?:[\W_][^\W_]+)? - 1次或0次出现:
    • [\W_] - 除字母数字字符之外的1个字符
    • [^\W_]+ - 一个或多个字母数字字符

答案 1 :(得分:0)

您似乎已经以更复杂的方式向自己陈述了这个问题,或者您提供了一个比您尝试做的更简单的示例。

如果您尝试从字符串的开头和结尾删除不需要的字符,那么您可以执行myString.Trim('\ n','。')。如果您不知道要删除的具体字符集,可以执行以下操作:

Regex.Replace(str, "[^\\w]*$","");

答案 2 :(得分:0)

您可以使用此RegEx直接获得比赛:

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]字符,直到第二个其他字​​符。 ?使第二部分成为条件。