我有一个总是采用一般形式的字符串。我希望从中提取信息并将其放在一个数组中。
给出以下输入:
John Doe +22 \ r \ nPong
我想要以下输出
约翰·多伊
+22
乒乓球
我正在使用以下代码来提取我想要的详细信息。
public static string[] DetailExtractor(string input)
{
return Regex.Matches(input, @"(.*(?=\s\+))|(\+\d{1,2}(?=\\r\\n))|((?<=\\r\\n).*)")
.OfType<Match>()
.Select(m => m.Value)
.ToArray();
}
但它给了我以下输出:
球员姓名
“”
但是,在此online regex tester中使用相同的正则表达式匹配我想要的所有元素。
为什么它适用于一个而不是另一个? Regex.Matches不能像我认为的那样工作吗?
答案 0 :(得分:0)
您可以尝试使用以下方法之一:
[a-z]+ [a-z]+ \+[0-9]{1,}\\r\\n[a-z]+
或:
[a-z\s\\]+\+[0-9]{1,}[a-z\s\\]+
或:
[\w\s]+\+\d{1,}\\r\\n[\w]+
答案 1 :(得分:0)
如果您不关心文本中的 + 符号,则可以通过基于 \ n,\ r 和<分割文本来获得更简单的解决方案强> + 强>
public static string[] DetailExtractor(string input) {
char[] delimiterChars = {'\n', '\r', '+'};
return input.Split(delimiterChars);
}
// call the function
string[] A = DetailExtractor("John Doe +22\r\nPong");
答案 2 :(得分:0)
这里只是猜测,但我打赌您正在使用以下内容:
var details = DetailExtractor("John Doe +22\r\nPong");
上面会将\r\n
转换为回车符和换行符。这会阻止你写的正则表达式。相反,您可以在C#中指定原始字符串或转义\r\n
:
var details = DetailExtractor(@"John Doe +22\r\nPong");
或
var details = DetailExtractor("John Doe +22\\r\\nPong");
正如其他所有人都指出的那样,根据您的需要,可以使用相同类型的匹配更简单的正则表达式。
下面的正则表达式稍微简单一点,但字符串数组的返回稍微复杂一些。
public static string[] DetailExtractor1(string input)
{
var match = Regex.Match(input, @"^(?<name>\w+\s+\w+)\s+(?<num>\+\d+)\r\n(?<type>\w+)");
if (match.Success)
{
return new string[] {
match.Groups["name"].Value,
match.Groups["num"].Value,
match.Groups["type"].Value
};
}
return null;
}