2008-08-07 105 views
10

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

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

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

+0

不要忘记阅读java.util.regex.Pattern的Javadocs。这是一个很好的参考。另外http://perldoc.perl.org/perlre.html – 2009-09-17 09:21:56

回答

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} /“是正则表达式,并且您可以看到它是一个非常合作的ncise在字符串中找到匹配的方式。

此外,使用基团可以提取信息,因为这样的:

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

在此,在正则表达式的括号标记捕获组,这样就可以看到什么数据是你匹配,所以你可以做进一步的处理。

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

0

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

正则表达式的一个很好的资源:http://www.regular-expressions.info

7

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

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

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

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

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

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

两个环节,我想你会发现适合完成这个是

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

这是一个很好的描述,但是迈克的真实世界的例子比双字节'2b'更好。将两者结合起来会很好。 – 2008-10-13 10:19:46

+0

关于`2`的'squiggly`括号并不常见,它们都是'卷曲的'。 – Timo 2017-12-11 08:03:10

0

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

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

2

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

6

最酷的正则表达式不断

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

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

N.B .:为了使其工作,需要一些设置;我们要测试的数量必须被转换成“1”的字符串的第一个,然后我们可以将表达式来测试如果字符串包含的“1” S素数:

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

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

0

这些RE的是特定于Visual Studio和C++,但我发现他们有帮助的时间:

找到 “routineName” 所有出现的非默认PARAMS通过:

routineName \(: A + \)

反之找到 “routineName” 所有出现的唯一默认: routineName \(\)

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

\ #if。 _DEBUG *

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

0

验证强密码

这一个将验证用5至10字母数字字符的长度的密码,与至少一个上壳体,一个下壳体和一位数字:

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