我有一些文字,例如“项目编号 - 项目描述”,例如“13-40 - 计算机键盘”,我想将其分成项目编号和项目描述。
这可能是1个正则表达式,还是我需要2个(一个用于项目,一个用于描述)?
我无法弄清楚如何“分组”它 - 就像物品编号可以是这样,描述可以是这样,而不会认为一切都是物品编号。例如:
(\w(\w|-|/)*\w)-.*
将所有内容匹配为1匹配。
这是我正在使用的代码:
Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches("13-40 - Computer Keyboard");
Assert.AreEqual("13-40", matches[0].Value);
Assert.AreEqual("Computer Keyboard", matches[1].Value);
答案 0 :(得分:4)
从您发布的代码中,您使用的是正则表达式错误。你应该有一个正则表达式模式来匹配整个产品,并使用匹配中的捕获来提取数字和描述。
string RegExString = @"(?<number>[\d-]+)\s-\s(?<description>.*)";
Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
Match match = rx.Match("13-40 - Computer Keyboard");
Debug.Assert("13-40" == match.Groups["number"].Value);
Debug.Assert("Computer Keyboard" == match.Groups["description"].Value);
答案 1 :(得分:1)
这是一个在Ruby中运行的正则表达式 - 不确定c#regexp是否有任何差异:
/^([\d\-]+) \- (.+)$/
答案 2 :(得分:1)
([0-9-]+)\s-\s(.*)
第1组包含项目编号,第2组包含说明。
答案 3 :(得分:1)
CaffeineFueled的答案对于C#是正确的。
Match match = Regex.Match("13-40 - Computer Keyboard", @"^([\d\-]+) \- (.+)$");
Console.WriteLine(match.Groups[1]);
Console.WriteLine(match.Groups[2]);
结果:
13-40
电脑键盘
答案 4 :(得分:0)
如果您的文字总是用短划线划分,并且不必须处理数据中的破折号,则您不必使用正则表达式。
string[] itemProperties = item.Split(new string[] { "-" });
itemProperties = itemProperties.Select(p => p.Trim());
Item item = new Item()
{
Number = itemProperties[0],
Name = itemProperties[1],
Description = itemProperties[2]
}
答案 5 :(得分:0)
您似乎不想匹配群组,但有多个匹配。
也许这会做你想要的?
(:^.+(?=( - ))|(?<=( - )).+$)
分手:
(: Used to provide two possible matches
^.+ Match item ID text
(?=( - )) Text must be before " - "
| OR
(?<=( - )) Test must be after " - "
.+$ Match description text
)
答案 6 :(得分:0)
这不如CaffineFueled的答案那么优雅,但对于正则表达式初学者来说可能更容易阅读。
String RegExString = "(\d*-\d*)\s*-\s*(.*)";
Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches("13-40 - Computer Keyboard");
Assert.AreEqual("13-40", matches[0].Value);
Assert.AreEqual("Computer Keyboard", matches[1].Value);
甚至更具可读性:
String RegExString = "(\d*-\d*) - (.*)";