我需要解析一些大型文本文件,并且仅当它与以下模式匹配时才提取Display name
和area code
:
display name
开头(任意数量的字词,但不能包含数字或特殊字符)#text
代码输入文件
John doe 123 456 #text some text
Test 123456 #text
Test$test 123456 #text
Test123 345678 #text
Test 123 #test
Test 123456 #test1
Test 123g45 #test
输入和预期输出
John doe 123 456 #text some text
Display name: John doe
Area code: 123 456
Test 123456 #text
Display name: Test
Area code: 123456
Test$test 123456 #text
Invalid, display name contains special character
Test123 345678 #text
Invalid, display name contains digits
Test 123 #test
Invalid, area code contains only 3 digits
Test 123456 #test1
Invalid, contains invalid tag
Test 123g45 #test
Invalid, area code contains letters
等
我知道如何打开文本文件并逐行阅读,但是编写正则表达式时遇到了麻烦。
这就是我的尝试:
private static void Main(string[] args)
{
string text = "John Doe 123 45 #text Lorem ipsum dolor :)";
string pattern = @"(\w+)*([0-9]{2,5}).([0-9]{2,5}).#text";
Match match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
if (match.Success)
{
string key = match.Groups[0].Value;
Console.WriteLine(key);
}
}
编辑:
以下是更多解释
显示名称
显示名称可以包含任意数量的单词,例如
John Michael Smith
有效,因为John
是名字,Michael
是中间名,Smith
是姓。 Šljaker
也是有效的显示名称,因为它是某人的昵称,可能包含非英文字符。但是带有数字的名字无效,例如。 John1
。为什么?这是我们的商业规则,没有数字:)我想\w
将在这里工作,a-zA-Z
不会,因为它不会涵盖非英文字母。
区号
业务规则很简单:它必须包含6个数字,我们不关心它们的格式。
所有这些都是有效的区号:123456,12 34 56,1234 56等。正则表达式不需要修剪空格,我将在代码中处理。
非常感谢任何帮助!
答案 0 :(得分:0)
编写正确的正则表达式时,输入的规范仍然有点模糊。在编写正则表达式之前,有必要降低规范,或者至少做出适用于当前数据集的假设。
这是我写的正则表达式,正则表达式将验证整行。假设来得晚。
^([a-zA-Z ]+)(?<! ) +((?:[0-9] *){6}) *#text( .*)?$
我只在输入中允许空格(ASCII 32)。如果要允许标签和其他空格字符,可以用\s
替换正则表达式中的空格。
([a-zA-Z ]+)(?<! ) +
:匹配并捕获显示名称。显示名称中仅允许使用英文字母和空格。 (?<! )
用于抑制捕获组的尾随空间;它有另一个效果,即只允许空格禁止名称。如果您想允许Unicode中的任何字母匹配,请使用[\p{L} ]+
代替[a-zA-Z ]+
。
((?:[0-9] *){6})
:正好6个十进制数字,由任意数量的空格分隔。由于在此片段之前匹配1个空格或更多 +
,因此不会允许数字粘在显示名称上。
*#text( .*)?
:我允许数字贴在标签上(例如Name 123456#text dfsjhdf
);将其更改为+#text( .*)?
以禁止此操作。 ( .*)?
如果有更多评论,或#text
后面没有任何评论(例如#text
),请确保Name 123456 #text
后有空格。
此正则表达式中捕获的文本将:
答案 1 :(得分:0)
您可以使用以下内容替换正则表达式:
@"^([\D]+)\s*((?:\d\s*?){6})\s*\#text\s*(.*)$"
按顺序搜索
由于这是针对多行进行评估的,因此请考虑添加RegexOptions.Compiled
标志(即:RegexOptions.IgnoreCase | RegexOptions.Compiled
)。
显示名称存储为match.Groups[1].Value
;区号为match.Groups[2].Value
,文字为match.Groups[3].Value
。