所以我正在尝试清理一些文本块。我认为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;
但是如何忽略正则表达式中的第一个.
并获取第二个非字母数字值的索引。作为奖励:如果字符串中没有.
,有没有办法返回第一个非字母数字值?
答案 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]字符,直到第二个其他字符。 ?
使第二部分成为条件。