2013-12-24 45 views
1

在C#中,我试图验证字符串,看起来像:等号的正则表达式问题?

[email protected]='test'

[email protected]=2827

这里是我的代码:

string t1 = "[email protected]='test'"; 

string r = @"^([Ii]|[Oo])@\w=\w"; 

var re = new Regex(r); 

如果我走“= \ w”关闭结束或变量r我变为True。如果我在\ w后面添加一个“= \ w”,它就是False。我希望@和=之间的字符能够是任何字母数字值。 =号后的任何内容都可以包含字母数字和'(单引号)。我在这里做错了什么。我很少使用正则表达式,通常可以找到示例,这是自定义格式,但即使有我遇到的问题。

+0

东西'''不是一个“单词字符”,因此它不会匹配'\ w'。比较使用''I @ parameter = test''作为输入时的结果。 – user2864740

+0

也许这样(未经测试):'([IiOo])@ \ w + = [\ w'] +' – Blorgbeard

回答

4
^([Ii]|[Oo])@\w+=(?<q>'?)[\w\d]+\k<q>$ 

正则表达式:

^    start of line 
([Ii]|[Oo]) either (I or i) or (O or o) 
\w+   1 or more word characters 
    =   equals sign 
    (?<q>'?)  capture 0 or 1 quotes in named group q 
    [\w\d]+  1 or more word or digit characters 
    \k<q>  repeat of what was captured in named group q 
$    end of line 
+0

刚刚意识到对于以O开头的字符串,我不需要等号或值。有没有办法让这个“可选”? –

2

使用\w+而不是\w设置为一个字符或更多。或\w*获得零个或多个:

试试这个:Live demo

^([Ii]|[Oo])@\w+=\'*\w+\'* 
1

如果您正在多一点严格使用paramname

^([Ii]|[Oo])@paramname=[']?[\w]+[']? 

Here is a demo

+0

paramname不能被硬编码我只是以此为例。它实际上用于通用函数来调用存储过程,并且这将是存储过程参数的名称。 –

+0

I/O(输入/输出),然后是等号后的值。 –

+0

所以,现在你让我想到了......我无法将一个值传递给OUT存储过程参数。我将不得不对其进行修改,否则在等号后忽略任何内容。感谢让我的头脑开始移动:) –

1

你可以尝试这样的事:

Regex rx = new Regex(@"^([IO])@(\w+)=(.*)$" , RegexOptions.IgnoreCase) ; 
  • 比赛第1组会给你我或澳值
  • 赛第2组会给你(参数方向?)参数的名称
  • 匹配组3将给出参数的值

你可能是对第3组严格,与之相匹配的为

(([^']+)|('(('')|([^']+))*')) 

第一个选择匹配1个或多个非引号字符;第二个选择带引号的字符串相匹配的文字与任何内部(嵌入式)被他们加倍报价逃生,所以它会匹配像

  • ''(空字符串
  • 'foo bar'
  • 'That''s All, Folks!'