正则表达式问题匹配字符串模式“A-Za-z-A-Za-z_”

时间:2012-04-19 09:40:55

标签: c# xml regex linq-to-xml pattern-matching

我正在尝试编写一个正则表达式来匹配一个字符串形式:

"[A-Za-z][A-Za-z]-[A-Za-z][A-Za-z]_[match all chars]"

我想要匹配的字符串必须是这种形式,包括连字符和下划线。到目前为止,我有:

Regex regEx = new Regex(@"[A-Za-z]+(-[A-Za-z]+)+*$", RegexOptions.IgnorePatternWhitespace);

我不确定如何添加下划线字符以便匹配。

这个元素是我希望匹配的XML元素;我还想检索这个元素的内容。我怎么能这样做?

var newVar = from e in doc.Descendants("DocumentElement").Descendants() 
                         where regEx.IsMatch(e.Name.LocalName) 
                        select e;

4 个答案:

答案 0 :(得分:7)

我用

@"^[A-Za-z]{2}-[A-Za-z]{2}_.*$"

说明:

  • ^行首
  • [A-Za-z]{2}正好2个字符必须是a-zA-Z
  • -短划线
  • _下划线
  • .*任何角色
  • $行尾

编辑:

另见Regex docs

答案 1 :(得分:2)

你的示例模式使用+大于1的+修饰符,而不是2.它会比你想象的更匹配。

Regex regEx = new Regex(@"^[A-Za-z]{2}-[A-Za-z]{2}_.*$", RegexOptions.IgnorePatternWhitespace);

或者只是设置不区分大小写的选项:

Regex regEx = new Regex(@"^[a-z]{2}-[a-z]{2}_.*$", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);

答案 2 :(得分:1)

我相信你想要的正则表达式是:

new Regex(@"^[A-Z][A-Z]-[A-Z][A-Z]_", RegexOptions.CaseInsensitive);

这应该捕获:
^[A-Z][A-Z]开头两个字母字符
-字面连字符字符
[A-Z][A-Z]另外两个字母字符
_字面下划线字符

您不能说要捕获此xml标记的全名,因此您不需要捕获.*$"任何其他字符,直到字符串结束& #34;一部分。

答案 3 :(得分:1)

请参阅此正则表达式。

在nregex.com上测试

^[A-Za-z]+(-[A-Za-z]+_[A-Za-z]{2})$

这里的关键事项: -

  • 字符串的最后一部分限定为2个字符(如果您不完全关心2个字符,请将其替换为+。)

这也执行捕获。