Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取第二个非字母数字的索引_C#_Regex - Fatal编程技术网

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);
}
详细信息

  • ^
    -字符串的开头
  • [^\W\u]+
    -1个或多个字母数字字符
  • (?:[\W\u][^\W\u]+)?
    -出现1次或0次:
    • [\W\u]
      -1个字符,而不是字母数字字符
    • [^\W\u]+
      -1个或多个字母数字字符

您似乎以一种更为复杂的方式向自己陈述了问题,或者您给出了一个比您试图做的事情简单得多的示例

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


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))。这对你的样品有效。