什么是好的正则表达式?

11

我主要从事于使用Java桌面应用程序,访问Oracle数据库的工作已经有5年了,但我从未使用过正则表达式。现在我进入Stack Overflow并看到很多关于它们的问题,感觉自己错过了什么东西。

你们是用正则表达式做什么的?

P.S. 对不起,我的英语不好。


不要忘记阅读 java.util.regex.Pattern 的 Javadocs。这是一个很好的参考。另外,http://perldoc.perl.org/perlre.html。 - Adrian Pronk
9个回答

7
正则表达式(或Regex)用于字符串中的模式匹配。因此,您可以从文本中提取所有电子邮件地址,因为它遵循特定的模式。 在某些情况下,正则表达式被包含在斜杠内,在第二个斜杠后面放置选项,例如大小写不敏感。以下是一个好的例子 :)
/(bb|[^b]{2})/i

口语中可以读作 "2 be or not 2 be"。

第一部分是括号,由管道符 | 分隔,它表示或语句,因此 (a|b) 匹配 "a" 或 "b"。 管道的前半部分匹配 "bb"。 第二部分的名称不知道,但它是方括号,它们匹配任何不是 "b" 的字符,这就是为什么那里有一个小尖屋顶符号(技术术语)。 波浪括号匹配它们之前的内容计数,本例中是两个不是 "b" 的字符。

第二个斜杠后是一个“i”,它使其不区分大小写。 开始和结束斜杠的使用取决于环境,有时需要使用,有时不需要。

我认为你会发现下面两个链接对你很有用:

  1. regular-expressions.info
  2. Wikipedia - Regular expression

这是一个不错的描述,但Mike的现实世界的例子比双关语的“2b”更可取。将两者结合起来会很好。 - Bobby Jack
“squiggly”括号在关于“2”的情况下并不常见,它们是“curly”的。 - Timo

7
考虑一个 Ruby 的例子:
puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil?
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil?

"/\d{3}-\d{4}/"是正则表达式,可以看到它是在字符串中查找匹配项的非常简洁的方法。

此外,使用分组你可以提取信息,例如:

match = /([^@]*)@(.*)/.match("myaddress@domain.com")
name = match[1]
domain = match[2]

在这里,正则表达式中的括号标记一个捕获组,因此您可以看到您匹配的数据是什么,以便进行进一步处理。

这只是冰山一角...在正则表达式中,有许多不同的事情可以做,使文本处理变得非常容易。


6

最酷的正则表达式 曾经

/^1?$|^(11+?)\1+$/

这个代码测试一个数字是否是质数。并且它能够正常工作!

注意:为了使其正常工作,需要进行一些设置;我们要测试的数字必须先转换成一个由“1”组成的字符串,然后我们才能应用表达式来测试该字符串是否不包含质数个“1”:

def is_prime(n)
  str = "1" * n
  return str !~ /^1?$|^(11+?)\1+$/ 
end

Avinash Meetoo的博客中有一篇详细而易于理解的关于正则表达式检查素数的解释。


2
这很聪明,但对于初学者来说并不太合适! :) - Bobby Jack
@Copas:它绝对可以工作。你看了我链接的教程和解释吗? - Konrad Rudolph

2
如果你想学习正则表达式,我推荐精通正则表达式。它从非常基本的概念一直讲到不同引擎如何工作。最后4章还专门介绍了PHP、.Net、Perl和Java中的每个章节。我从中学到了很多,并仍将其用作参考。

0

验证强密码:

此代码将验证长度为5到10个字母数字字符的密码,其中至少包含一个大写字母、一个小写字母和一个数字:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$

0
正则表达式(regex或regexp)是一种用于描述搜索模式的特殊文本字符串。您可以将正则表达式视为强化版通配符。您可能熟悉通配符符号,例如*.txt以在文件管理器中查找所有文本文件。相应的正则表达式是.*\.txt$
一个关于正则表达式的好资源:http://www.regular-expressions.info

0

0

正如您所知,Oracle现在拥有正则表达式:http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html。我已经在一些查询中使用了新功能,但它在其他情况下并不像其他情况那样有用。我认为原因是正则表达式最适合查找嵌入在非结构化数据中的结构化数据。

例如,我可能会使用正则表达式来查找存储在日志文件中的Oracle消息。无法知道消息的位置-只能知道它们的外观。因此,正则表达式是解决该问题的最佳方案。当您使用关系型数据库时,数据通常是预先结构化的,因此正则表达式在这种情况下并不突出。


0

这些正则表达式是针对Visual Studio和C++特定的,但我有时会发现它们很有用:

查找所有传递了非默认参数的“routineName”的出现次数:

routineName\(:a+\)

相反,要查找所有仅使用默认值的“routineName”出现次数: routineName\(\)

要查找在调试构建中启用(或禁用)的代码:

\#if._DEBUG*

请注意,这将捕获所有的变体:ifdef,if defined,ifndef,if!defined。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接