繁体   English   中英

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

[英]Get index of second non-alphanumeric

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

如果我有不同的文本,需要格式化

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查找所有匹配项,然后检查是否可以访问具有必要索引的项目,如果是,请从Match对象获取所需的详细信息:

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

顺便说一句,非字母数字模式是[\\W_] ,而字母数字模式是[^\\W_] [\\w-[_]] (或[\\w-[_]] )。

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

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

正则表达式演示

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

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

详细资料

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

看来您以一种更为复杂的方式向自己陈述了该问题,或者您举了一个比您要尝试的例子简单得多的示例。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM