2

问候。

我的任务是调试涉及正则表达式的应用程序的一部分——但是,我以前从未处理过正则表达式。两个问题:

1)我知道正则表达式应该测试两个字符串是否等价,但是下面的两个正则表达式语句具体是什么意思?

2) 有没有人推荐我可以了解更多关于正则表达式的网站/资源?(最好在 C# 中)

if (Regex.IsMatch(testString, @"^(\s*?)(" + tag + @")(\s*?),", RegexOptions.IgnoreCase))
                {
                    result = true;
                }
else if (Regex.IsMatch(testString, @",(\s*?)(" + tag + @")(\s*?),", RegexOptions.IgnoreCase))
                {
                    result = true;
                }
4

14 回答 14

5

在不知道tag. 事实上,看起来正则表达式被破坏了(或者,至少,没有正确地转义输入)。

粗略地说,对于第一个正则表达式:

  • 表示要在字符串的^开头匹配。
  • 设置了一个捕获组(这(...)是可用的,虽然这个例子显然没有使用它)。
  • \s匹配任何空白字符(空格、制表符等)
  • 匹配零个或多个前*?一个字符(在本例中为空格),并且因为它有一个问号,所以它匹配使表达式的其余部分工作所需的最小字符数。
  • (" + tag + @")的内容插入tag到正则表达式中。正如我所提到的,这很危险,没有逃脱。
  • 匹配与之前相同(空白字符的(\s*?)最小数量)
  • ,匹配尾随逗号。

第二个正则表达式非常相似,但查找的是逗号开头(而不是字符串的开头)。

我喜欢正则表达式的 Python 文档,但看起来这个站点 有一个非常好的基本介绍,以及 C# 示例。

于 2010-06-21T20:55:38.337 回答
1

我不是 c# 精通,但我可以推荐一个很棒的正则表达式指南,用于 Bash 和 Java 编程。它适用于几乎所有语言:

http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ref=tmm_pap_title_0

拥有这本书完全值 30 美元。它非常透彻,极大地帮助了我对 Regex 的基本理解。

-瑞安

于 2010-06-21T21:00:06.533 回答
1

使用正则表达式教练

The regular expression is a sequence consisting of the expression '(\s*?)', the expression '(tag)', the expression '(\s*?)', and the character ','.

其中 (\s*?) 定义为The regular expression is a repetition which matches a whitespace character as often as necessary.

第二个,在开始时也匹配 a

至于好的学习网站,我喜欢www.regular-expressions.info/

超级简单的版本:

在字符串的开头有 0 个或多个空格,无论 Tag 是什么,0 个或多个空格,一个逗号。

第二个是

一个逗号,0 个或多个空格,无论 Tag 是什么,0 个或多个空格,一个逗号。

于 2010-06-21T20:54:39.557 回答
1

由于您专门标记了 C#,因此我推荐Regex Hero作为一种工具,您可以使用它来玩弄它们,因为它在 .NET 上运行。它还允许您切换不同的RegexOptions标志,就像在创建新的Regex.

此外,如果您使用的是支持扩展的 Visual Studio 2010 版本,我会看看Regex Editor扩展...它会在您键入时弹出new Regex(,并为您的 regex 模式提供一些指导和自动完成。

于 2010-06-21T21:04:35.037 回答
1

一个词 - Cribsheet(还是那两个词?):)

于 2010-06-21T20:53:48.467 回答
0

1)第一个正则表达式试图从测试字符串的开头开始进行不区分大小写的匹配。然后它匹配可选的空格,然后是标签中的任何内容,然后是可选的空格,最后是逗号。

第二个匹配一个包含逗号的字符串,然后是可选的空格,然后是标签中的任何内容,然后是可选的空格,最后是逗号。

认为它适用于 C#,我建议选择 Perl Pocket Reference,它有一个很好的 Regex 语法参考。当我 14 年前学习正则表达式时,它帮助了我很多。

于 2010-06-21T21:08:37.577 回答
0

http://www.myregextester.com/是一个不错的正则表达式测试器,它也有一个正则表达式的解释选项C#- 例如,看看这个例子

正则表达式:

(?-imsx:^(\s*?)(tagtext)(\s*?),)

匹配如下:

节点说明
-------------------------------------------------- --------------------
(?-imsx: 组,但不捕获(区分大小写)
                         (与 ^ 和 $ 正常匹配)(与 . 不
                         匹配\n)(匹配空格和#
                         一般):
-------------------------------------------------- --------------------
  ^ 字符串的开头
-------------------------------------------------- --------------------
  (分组并捕获到 \1:
-------------------------------------------------- --------------------
    \s*? 空格(\n、\r、\t、\f 和“”)(0
                             或更多次(匹配最少的数量
                             可能的))
-------------------------------------------------- --------------------
  ) \1 结尾
-------------------------------------------------- --------------------
  (分组并捕获到 \2:
-------------------------------------------------- --------------------
    标记文本'标记文本'
-------------------------------------------------- --------------------
  ) \2 结尾
-------------------------------------------------- --------------------
  (分组并捕获到 \3:
-------------------------------------------------- --------------------
    \s*? 空格(\n、\r、\t、\f 和“”)(0
                             或更多次(匹配最少的数量
                             可能的))
-------------------------------------------------- --------------------
  ) \3 结尾
-------------------------------------------------- --------------------
  , ','
-------------------------------------------------- --------------------
) 分组结束
-------------------------------------------------- --------------------
于 2010-06-21T21:10:58.143 回答
0

看起来他们正在尝试匹配某种由冒号分隔的单词列表(更新:逗号)。第一个可能匹配第一个项目,第二个可能匹配第一个项目之后的某个项目,不包括最后一个项目。我希望你能理解:)。

关于正则表达式的一个很好的信息来源是http://www.regular-expressions.info/

于 2010-06-21T20:55:26.530 回答
0

一旦你对正则表达式有了非常基本的了解(那里有很多资源),我建议你使用Expresso来创建你的正则表达式。

Expresso 编辑器同样适合作为正则表达式初学者的教学工具,或作为具有丰富正则表达式知识的经验丰富的程序员或网页设计师的全功能开发环境。

于 2010-06-21T20:56:45.003 回答
0

你的前提不正确。正则表达式不用于判断两个字符串是否等价,而是用于判断输入字符串是否与某个模式匹配。

上面的第一个测试查找任何不包含“零个或多个空白字符”的文本,搜索“非贪婪”。然后匹配中间变量“tag”的文本,再匹配“零个或多个空格字符,非贪婪”。

第二个非常相似,除了它允许以逗号开头的空格开始。

在这种情况下很难解释“非贪婪”,尤其是涉及空白字符,因此请查看此处了解更多信息。

于 2010-06-21T20:56:52.797 回答
0

正则表达式是一种描述一组具有某些特定特征的字符串的方法。

他们不仅需要比较两个字符串..您通常会做什么来测试字符串是否特定的正则表达式匹配。它们还可以用于对符合某些模式的标记中的字符串进行简单的解析。

正则表达式的好处是它们允许您在字符串中表达某些约束,使其保持一般性并能够匹配一组尊重这些约束的字符串。然后它们遵循不会留下歧义的正式规范。

在这里,您可以找到许多不同编程语言中各种正则表达式语言的比较表以及 C# 的特定指南(如果您点击其链接)。

通常,各种语言的实现非常相似,因为语法从 regexps 的理论主题有所标准化,所以任何关于 regexp 的教程都可以,然后你只需要进入 C# API。

于 2010-06-21T20:57:36.203 回答
0

正则表达式不会告诉您两个字符串是否匹配,而是告诉您给定字符串是否与模式匹配。

这个网站是我学习和测试正则表达式的最爱:

http://gskinner.com/RegExr/

它允许您在编写正则表达式时以交互方式测试它们,并提供内置教程。

于 2010-06-21T21:13:15.697 回答
0

也是一个用额外信息测试你的正则表达式的好网站:http ://regex101.com/

于 2012-12-31T09:29:12.097 回答
0

虽然它不使用 C#,但 Rejex是一个用于测试和学习正则表达式的简单工具,其中包括特殊字符的快速参考

于 2010-06-21T21:15:40.573 回答