有什么好的正则表达式?

时间:2008-08-07 16:48:42

标签: regex

我已经工作了5年,主要是访问Oracle数据库的java桌面应用程序,我从未使用过正则表达式。现在我进入Stack Overflow,我看到很多关于它们的问题;我觉得我错过了什么。

你使用正则表达式是什么?

P.S。抱歉我的英文不好

9 个答案:

答案 0 :(得分:7)

正则表达式(或正则表达式)用于在字符串中模式匹配。因此,您可以从一段文本中提取所有电子邮件地址,因为它遵循特定的模式。

在某些情况下,正则表达式用正斜杠括起来,在第二个斜杠后面放置选项,例如不区分大小写。这是一个很好的:)

/(bb|[^b]{2})/i

说出它可以读作“2是或不是2”。

第一部分是(括号),它们被管道分开等于或声明的字符,因此(a | b)匹配“a”或“b”。管道区域的前半部分与“bb”相匹配。下半场的名字我不知道,但它是方括号,它们匹配“b”的任何东西,这就是为什么那里有屋顶符号的东西(技术术语)。波浪形括号与前面的事物的数量相匹配,在这种情况下,两个字符不是“b”。

在第二个/之后是“i”,使其不区分大小写。使用开始和结束斜杠是特定于环境的,有时你会这样做,有时则不然。

我认为你会发现两个方便的链接是

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

答案 1 :(得分: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]

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

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

答案 2 :(得分:6)

最酷的正则表达永远

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

它测试一个数字是否为素数。它有效!!

N.B。:为了使其有效,需要进行一些设置;我们要测试的数字必须首先转换为“1”的字符串,然后我们可以应用表达式来测试字符串是否包含素数“1”:

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

Avinash Meetoo’s blog处有一个详细且非常平易近人的解释。

答案 3 :(得分:2)

如果您想了解正则表达式,我建议Mastering Regular Expressions。它从最基本的概念一直到讨论不同引擎如何在其下工作。最后4章还为PHP,.Net,Perl和Java提供了专门的章节。我从中学到了很多东西,仍然用它作为参考。

答案 4 :(得分:0)

  

正则表达式(regex或简称regexp)是用于描述搜索模式的特殊文本字符串。您可以将正则表达式视为类固醇上的通配符。您可能熟悉诸如*.txt之类的通配符,以便在文件管理器中查找所有文本文件。正则表达式等价于.*\.txt$

正则表达式的绝佳资源:http://www.regular-expressions.info

答案 5 :(得分:0)

如果您刚开始使用正则表达式,我衷心推荐像The Regex Coach这样的工具:

http://www.weitz.de/regex-coach/

也听说过有关RegexBuddy的好消息:

http://www.regexbuddy.com/

答案 6 :(得分:0)

如您所知,Oracle现在有正则表达式:http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html。我在一些查询中使用了新功能,但它没有在其他环境中那么有用。我相信,原因是正则表达式最适合于查找隐藏在非结构化数据中的结构化数据。

例如,我可能会使用正则表达式来查找填充在日志文件中的Oracle消息。不可能知道消息的位置 - 只是它们的样子。因此正则表达式是解决该问题的最佳方案。当您使用关系数据库时,数据通常是预先构建的,因此正则表达式不会在该上下文中发挥作用。

答案 7 :(得分:0)

这些RE特定于Visual Studio和C ++,但我发现它们有时很有用:

查找所有出现的“routineName”,其中包含非默认参数:

routineName \(式:a + \)

相反,只用默认值查找所有出现的“routineName”:     routineName \(\)

在调试版本中查找启用(或禁用)的代码:

\#如果 _DEBUG *

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

答案 8 :(得分:0)

验证强密码

这个密码将验证一个长度为5到10个字母数字字符的密码,至少有一个大写字母,一个小写字母和一个数字:

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