什么是好的正则表达式?

我已经工作了5年,主要在访问Oracle数据库的Java桌面应用程序中,并且我从未使用正则表达式。现在我输入Stack Overflow,我看到很多关于它们的问题;我觉得我错过了一些东西。

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

附:对不起,我的英语不好

0
不要忘记阅读java.util.regex.Pattern的Javadocs。这是一个很好的参考。另请 perldoc.perl.org/perlre.html
额外 作者 Adrian Pronk,

9 答案

正则表达式(简称正则表达式或正则表达式)是用于描述搜索模式的特殊文本字符串。你可以将正则表达式看作类固醇上的通配符。您可能熟悉诸如 *。txt 的通配符符号,以查找文件管理器中的所有文本文件。正则表达式相当于。* \。txt $

A great resource for regular expressions: http://www.regular-expressions.info

0
额外

考虑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("[email protected]")
name = match[1]
domain = match[2]

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

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

0
额外

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

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

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

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

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

在第二个/是一个“我”,这使得它不区分大小写。开始和结束斜杠的使用是特定于环境的,有时候你会,有时候你不会。

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

  1. regular-expressions.info
  2. 维基百科 - 正则表达式
0
额外
关于 2squiggly 括号并不常见,它们是 curly
额外 作者 Timo,
这是一个很好的描述,但是迈克的真实世界的例子比双字节'2b'更好。将两者结合起来会很好。
额外 作者 Bobby Jack,

如果你刚开始使用正则表达式,我衷心推荐一个工具,如The Regex Coach:

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

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

http://www.regexbuddy.com/

0
额外

Validating strong passwords:

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

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

最酷的正则表达式 ever

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

它测试一个数字是否为素数。它的工作原理!

N.B .:为了使其工作,需要一些设置;我们想要测试的数字必须首先转换为 1 的字符串,然后然后,我们可以应用表达式来测试字符串是否执行不是包含质数? 1 ?s:

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

那里有一个详细的,非常平易近人的解释,在 Avinash Meetoo的博客

0
额外
这很聪明,但对初学者来说不太合适! :)
额外 作者 Bobby Jack,
@Copas:它绝对有效。你有没有读过我曾经链接过的how-to和解释?
额外 作者 Konrad Rudolph,
这似乎并不奏效......或者我错过了一些东西。
额外 作者 Copas,

如果您想了解正则表达式,我推荐掌握正则表达式。它从最基本的概念开始,一直到讨论不同引擎如何在底下工作。最后4章还为PHP,.Net,Perl和Java中的每一章都提供了专门的章节。我从中学到了很多东西,仍然将其作为参考。

0
额外

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

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

0
额外

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

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

routineName \(式:a + \)

Conversely to find all occurrences of "routineName" with only defaults: routineName\(\)

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

\#if._DEBUG*

请注意,这将捕获所有变体:ifdef,如果已定义,ifndef,if!已定义

0
额外