我没有得到正则表达式

时间:2009-02-26 11:21:02

标签: regex

我不明白或不需要正则表达式。

有些人可以用简单的术语解释它们,并提供一些可能有用甚至是关键的基本例子。

12 个答案:

答案 0 :(得分:30)

在需要使用/操作模式的地方使用它们。例如,假设您需要识别以下模式:

  • 任何字母,A-Z,大写或小写,5或6次
  • 3位数
  • 单个字母a-z(绝对小写)

(像这样的东西会出现邮政编码,信用卡,社会安全号码验证等。)

在代码中写入并不是真的 hard - 但随着模式变得更复杂,它变得更难。使用正则表达式,您可以描述模式(而不是验证它的代码),并让正则表达式引擎为您完成工作。

此处的模式类似于

[A-Za-z]{5,6}[0-9]{3}[a-z]

(还有其他表达方式。)分组结构可以轻松匹配整个模式并抓取(或替换)它的不同位。

但有一些缺点:

  • 正则表达式变得复杂且难以快速阅读。文件彻底!
  • 不同的正则表达式引擎之间存在行为差异
  • 如果你不是专家(我当然不是!),很难判断复杂性。有“陷阱”可以使模式对特定输入真的很慢,而这些问题根本不明显
  • 有些人过度使用正则表达式(当然还有一些人没有充分利用它们)。我见过的最糟糕的例子是有人问(在C#组上)如何检查字符串是否为3 - 这显然是使用String.Length的工作,但有人认真建议匹配一个正则表达式。疯狂。 (他们也得到了正则表达式错误,这有点证明了这一点。)
  • 正则表达式使用反斜杠来逃避各种事情(例如,使用。表示“一个点”而不仅仅是“任何字符”。在许多语言中,反斜杠本身需要转义。

答案 1 :(得分:23)

正则表达式用于:

正则表达式本身就是一种语言,允许您对字符串输入执行复杂的验证。即你传递一个字符串,如果是匹配则返回true或false。

如何使用正则表达式:

  • 表单验证,确定用户输入的内容是否为您想要的格式
  • 在文本块中查找特定模式的位置
  • 搜索并替换搜索词是正则表达式的位置以及要替换的内容是普通字符串。

一些正则表达式语言功能:

  • 轮换:允许您选择一件或另一件事。示例仅匹配是或否。

    是|否

  • 分组:您可以使用括号定义范围并具有优先级。例如,匹配3种颜色。

    GR(A | E)Y |黑色|白色

  • 量化:您可以量化您想要的数量。 ?表示1或0,*表示0或更多。 +表示至少一个。示例:接受非空的二进制字符串:

    (0 | 1)+

为什么使用正则表达式?

正则表达式可以很容易地匹配字符串,它通常可以用简单的小正则表达式字符串替换几十行源代码。

不适用于所有类型的匹配:

要了解某些内容是如何有用的,您还应该了解它的用处。正则表达式对某些任务不利,例如,当您需要保证字符串具有相同数量的括号时。

几乎适用于所有语言:

正则表达式几乎适用于任何编程语言。

正式语言:

任何正则表达式都可以转换为确定性有限状态机。以同样的方式,您可以弄清楚如何制作将验证正则表达式的源代码。

示例:

[hc]+at 

匹配“hat”,“cat”,“hhat”,“chat”,“hcat”,“ccchat”等,但不是“at”

Source, further reading

答案 2 :(得分:4)

它们看起来有点神秘,但它们提供了一个非常强大的工具,用于在文本中找到模式。从HTML页面中的href个标签到验证电子邮件地址的任何内容。

它们可以被处理成非常有效的数据结构(FSA),可以非常快速地找到匹配项。

答案 3 :(得分:3)

它们有点棘手,但非常强大,值得学习。网络上充满了教程和示例,例如从here开始,查看示例here

答案 4 :(得分:3)

如果我可以就自己的一个问题向OP发出一些答案/评论:How important is knowing Regexs?

答案 5 :(得分:1)

正则表达式是指定大多数模式匹配和替换问题的非常简洁的方法,并且可以非常高度优化正则表达式引擎。

如果你想做一个相对简单的正则表达式相同的工作,你必须编写很多代码,这些代码可能包含许多错误,难以理解并且表现不佳。

然而,对正则表达式执行相同操作要短得多,几乎可以肯定在技术上可行,并且对于熟悉正则表达式的人来说更容易理解(尽管在任何一种情况下都应该注释)

答案 6 :(得分:1)

电子邮件示例实际上是正则表达式的一个不好的例子。可以使用正则表达式,但结果表达式(例如this one不处理“John Doe”样式地址)非常复杂 - 看看email address specification,你会明白为什么。 ..

然而,正则表达式在许多其他情况下非常有用,从文本中提取IP地址,从html中提取标记等。查找所有版本化文件将是另一个示例。有点像:

my_versioned_file_(\d{4}-\d{2}-\d{2}).txt

将匹配格式my_versioned_file_2009-02-26.txt的所有文件名,并将日期作为捕获的组(包含在“()”中的部分)拉出来供您进一步分析。

没有正则表达式是没有必要的,但是他们可以节省一个时间的世界,为正则表达式可以轻松实现的东西编写手动解析器。

答案 7 :(得分:0)

给你一些例子:

  • 电子邮件地址

  • 密码至少需要1个字母和1个数字

  • 您如何实现这些要求?

  • 最好的方法是使用正则表达式。

阅读以下链接以了解更多信息:

如何:使用正则表达式来约束ASP.NET中的输入 http://msdn.microsoft.com/en-us/library/ms998267.aspx

答案 8 :(得分:0)

每当你有一些模式可以在很多文本数据中找到,或者你想要检查一个字符串是否是某种格式。

例如电子邮件地址......

检查at符号的代码和有效域的存在看起来很大,你可以使用正则表达式并在2行代码中得到答案。

Regex r = new Regex("<An Email Address Regex>");
bool isValidEmail = r.IsMatch(MyInput);

其他示例是在将数据解析为整数等之前检查数字的格式是否正确。

答案 9 :(得分:0)

Jon和Sqook给出了正则表达式的精细解释和定义,对于简单的问题,它是可以理解的,但是如果你将它用于复杂的问题,正则表达式可以是&amp; $ @ ( (至少对我而言; - ))

我使用Expresso来帮助我构建复杂的正则表达式代码。

http://www.ultrapico.com/Expresso.htm

它有一个带有可以使用的表达式的库构建,一个可以构建代码的设计模式和一个可以测试和验证代码的测试模式。它帮助我更好地构建和理解复杂的表达式!

古德勒克!

答案 10 :(得分:0)

一些实际的现实世界用法:

查找扩展JUnit的TestCase的抽象类:

abstract\s+class\s+\w+\s+extends\s+TestCase

这对于查找无法实例化的测试用例很有用,并且需要从运行测试用例的ant构建脚本中排除。您无法搜索常规文本,因为您事先不知道类名。因此\ w +(至少一个单词字符)。

查找正在运行的bash或bourne shell脚本:

 ps -e | grep -e " sh| bash"

如果你想要杀死它们或者什么东西,这很有用,如果你只搜索sh,你就不会得到bash,并且必须再次为bash脚本运行命令。同样,比完美更有用,但几乎没有你在飞行中写的正则表达式。

它并不完美,但大多数正则表达不会,或者他们花费这么长时间才能写出它们不值得。你完善的那些是你作为某种验证或构建应用程序的一部分提交的那些。

答案 11 :(得分:0)

关键用途的示例是 JavaScript
如果您需要对字符串执行searchreplace,则唯一可以匹配的是正则表达式。它位于那些字符串方法的JavaScript API中......

就我个人而言,只有当我在文本编辑器(TextPad或Visual Studio)中的某些自动查找/替换中需要一些高级匹配时,我才会使用正则表达式。我认为最强大的功能是能够匹配可插入替换中的模式。