Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# 如何从文本中筛选URL和电话号码,除非它们以***_C#_Regex - Fatal编程技术网

C# 如何从文本中筛选URL和电话号码,除非它们以***

C# 如何从文本中筛选URL和电话号码,除非它们以***,c#,regex,C#,Regex,我在用C#中的正则表达式筛选文本中的所有URL和电话号码时遇到了一个问题,除非它们以***开头。如果更简单的话,星星也可以是其他角色。 例如,排除以开头的URL的筛选!或者在[]里面 我使用的是regex.Replace(text,replacement)方法 var rgx = new Regex(pattern, RegexOptions.IgnoreCase); rgx.Replace(str, replacement ?? "[ URL HIDDEN ]"); 因此,我设法通过以下方式

我在用C#中的正则表达式筛选文本中的所有URL和电话号码时遇到了一个问题,除非它们以***开头。如果更简单的话,星星也可以是其他角色。 例如,排除以开头的URL的筛选!或者在[]里面

我使用的是regex.Replace(text,replacement)方法

var rgx = new Regex(pattern, RegexOptions.IgnoreCase);
rgx.Replace(str, replacement ?? "[ URL HIDDEN ]");
因此,我设法通过以下方式处理电子邮件:

\b(?<!(\*\*\*))[A-Z0-9._%+\*-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b
我当前用于过滤电话号码的正则表达式:

\+?[0-9]{0,4}[\.\-\/)( ]*[0-9]{3,4}[\.\-\/)( ]*[0-9]{3,4}[\.\-\/)( ]*[0-9]{3,4}(?![a-z]{1,4})

我试着用很多变体来处理lookahead和lookahead,但没有找到解决方案


谢谢你的帮助。另外,如果您有任何其他更好的建议或解决方案,我将不胜感激。

您可以使用正则表达式进行筛选,也可以使用类似以下内容对其进行迭代:

List<string> origins = new List<string> { "Do I really start with stars?", "***How about me, do I start with stars?" };
foreach (string item in origins)
{
    if (item.StartsWith("***"))
    {
    Console.WriteLine("item " + item + " starts with ***");
    }
    else
    {
    Console.WriteLine("item " + item + " does NOT start with ***");
    }
}
Console.ReadLine();

由于URL,尤其是电话模式包含可选部分,甚至可能包含空格,因此仅进行查找是不起作用的,或者至少您必须添加几个lookbehind,这将使模式变得不合适

我建议使用一种常见的方法:匹配并捕获您需要保留的内容,然后匹配您需要替换的内容

使用两个备选方案动态构建模式:第一个匹配并捕获前面带有
***
的模式,另一个不包含在捕获组中。在match evaluator中,检查组1是否匹配,如果匹配,则保留它,否则替换匹配:

var rxUrl = @"\b(https?://(www\.)?)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}[-a-zA-Z0-9@:%_+.~#?&/=]*";
var rxPhone = @"\+?[0-9]{0,4}(?:[-./() ]*[0-9]{3,4}){3}(?![a-z]{1,4})";
var rxEmail = @"(?i)\b[A-Z0-9._%+*-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b";
var s = "abc@email.com ***abc@email.com +22 345 456 678 ***+22 345 456 678 http://eee.tt ***http://eee.tt";
var res = Regex.Replace(s, $@"(\*{{3}}{rxUrl})|{rxUrl}", m => m.Groups[1].Success ? m.Value : "[ URL HIDDEN ]");
res = Regex.Replace(res, $@"(\*{{3}}{rxPhone})|{rxPhone}", m => m.Groups[1].Success ? m.Value : "[ PHONE HIDDEN ]");
res = Regex.Replace(res, $@"(\*{{3}}{rxEmail})|{rxEmail}", m => m.Groups[1].Success ? m.Value : "[ EMAIL HIDDEN ]");
Console.WriteLine(res);
// => [ URL HIDDEN ] ***abc@email.com [ PHONE HIDDEN ] ***+22 345 456 678 [ URL HIDDEN ] ***http://eee.tt


请参阅。

您是否在
Regex.IsMatch
中使用它?请展示你如何使用这些模式。我修改了我的答案。我目前正在使用替换方法。好的,我会建议一些非常通用的方法。谢谢。但我不知道如何将其应用于从文本中查找和过滤特定内容。。。电子邮件、URL和电话号码
来源
将由您用来获取链接、电子邮件和电话号码的任何内容填充。一旦“origins”有了值,您就可以检查这些值并对其进行操作。如果您还需要替换前面有3个以上星号的事件,您需要使用
(?而不仅仅是
\*{3}
。谢谢。我将实现并测试它。我会让您知道。
***123-456-7890 (does not qualify)
123-456-7890 (does qualify)
http://blahblahblah.com (does qualify)
***http://blahblahblah.com (does not qualify)
var rxUrl = @"\b(https?://(www\.)?)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}[-a-zA-Z0-9@:%_+.~#?&/=]*";
var rxPhone = @"\+?[0-9]{0,4}(?:[-./() ]*[0-9]{3,4}){3}(?![a-z]{1,4})";
var rxEmail = @"(?i)\b[A-Z0-9._%+*-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b";
var s = "abc@email.com ***abc@email.com +22 345 456 678 ***+22 345 456 678 http://eee.tt ***http://eee.tt";
var res = Regex.Replace(s, $@"(\*{{3}}{rxUrl})|{rxUrl}", m => m.Groups[1].Success ? m.Value : "[ URL HIDDEN ]");
res = Regex.Replace(res, $@"(\*{{3}}{rxPhone})|{rxPhone}", m => m.Groups[1].Success ? m.Value : "[ PHONE HIDDEN ]");
res = Regex.Replace(res, $@"(\*{{3}}{rxEmail})|{rxEmail}", m => m.Groups[1].Success ? m.Value : "[ EMAIL HIDDEN ]");
Console.WriteLine(res);
// => [ URL HIDDEN ] ***abc@email.com [ PHONE HIDDEN ] ***+22 345 456 678 [ URL HIDDEN ] ***http://eee.tt