【发布时间】:2012-12-20 10:54:52
【问题描述】:
我需要解析一些大文本文件并提取 Display name 和 area code,前提是它与以下模式匹配:
- 行以
display name开头(任意数量的单词,但不能包含数字或特殊字符) - 后跟 6 位数字(可以包含空格)
- 后跟
#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 等。Regex 不需要修剪空格,我会在代码中处理。
任何帮助将不胜感激!
【问题讨论】:
-
我不明白你到底需要提取什么(对于你的例子,你想得到什么结果?)
-
@Superbest,我已经编辑了我的问题,但显然我的正则表达式非常错误:(
-
哦,我假设您的文本文件仅由这种行组成:John doe 123 456 #text some text, Test 123456 #test1 ?
-
@aurel.g,是的,没错。在示例中,我展示了该行的外观,所需的输出是什么,或者该行包含无效数据的原因。
-
@šljaker:我们可以假设显示名称是什么?