我有一个像这样的正则表达式问题,
给出一个像NAMEtony smithNUMBER100ADDRESSLAS vegas
这样的输入字符串,
输入字符串有多个用NAME, NUMBER, ADDRESS
标记的字段,这些字段可以是可选的,并且顺序不固定。(它可以是ADDRESSLAS vegasNAMEtony smithNUMBER100, or NUMBER100NAMEtony smith
),
我试着使用正则表达式
(NAME([A-Za-z0-9\s]{1,}))?(NUMBER(([A-Za-z0-9\s]{1,}))?(ADDRESS([A-Za-z0-9\s]{1,}))?
去找匹配的,但它不工作。有人能帮上忙吗?
发布于 2018-12-05 08:51:28
从您的正则表达式来看,您的数据中似乎不能包含<
和>
。它可以让你的数据更容易解析:
var text = "NAMEtony smithNUMBER100ADDRESSLAS vegas";
var escapedText =
text.Replace("ADDRESS", "<ADDRESS>")
.Replace("NAME", "<NAME>")
.Replace("NUMBER", "<NUMBER>");
var dataFields = escapedText.Split('<'); // Now you have strings which look like "NAME>...."
foreach (var dataField in dataFields) {
if (dataField == "") // Somehow handle empty string in the beginning
continue;
var splitted = dataField.Split('>');
string field = splitted[0], data = splitted[1];
switch (field) {
case "NAME": ...
...
}
}
发布于 2018-12-05 12:30:23
这对输入字符串的所有三种情况都有效。
优点:非常简单的正则表达式。
缺点:在if
语句中手动设置变量的值。
var input = "NAMEtony smithNUMBER100ADDRESSLAS vegas";
//var input = "ADDRESSLAS vegasNAMEtony smithNUMBER100";
//var input = "NUMBER100NAMEtony smith";
var pattern = "(?'field'NAME|NUMBER|ADDRESS)(?'value'.+?)(?=NAME|NUMBER|ADDRESS|$)";
var matches = Regex.Matches(input, pattern);
string name = null;
string number = null;
string address = null;
foreach (Match m in matches)
{
var field = m.Groups["field"].Value;
var value = m.Groups["value"].Value;
if (field == "NAME")
name = value;
else if (field == "NUMBER")
number = value;
else if (field == "ADDRESS")
address = value;
}
Console.WriteLine(name);
Console.WriteLine(number);
Console.WriteLine(address);
https://stackoverflow.com/questions/53622148
复制相似问题