正则表达式和“组”

时间:2009-03-16 01:50:40

标签: c#

我有一些文字,例如“项目编号 - 项目描述”,例如“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);

7 个答案:

答案 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*) - (.*)";