11

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

你用正则表达式做什么?

PS对不起我的英语不好

4

9 回答 9

7

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

在某些情况下,正则表达式包含在正斜杠中,并且在第二个斜杠之后放置诸如不区分大小写之类的选项。这是一个很好的:)

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

口语可以读作“2 be or not 2 be”。

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

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

我认为您会发现这两个链接很方便

  1. 正则表达式.info
  2. 维基百科 - 正则表达式
于 2008-08-07T16:51:38.847 回答
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]

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

这只是冰山一角......您可以在正则表达式中执行许多不同的操作,从而非常轻松地处理文本。

于 2008-08-07T17:02:10.353 回答
6

有史以来最酷的正则表达式:

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

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

注意:要使其工作,需要进行一些设置;我们要测试的数字必须首先转换为“<code>1”的字符串,然后我们可以应用该表达式来测试该字符串是否包含“<code>1”的素数:

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

Avinash Meetoo 的博客上有一个详细且非常平易近人的解释。

于 2008-08-25T10:48:25.577 回答
2

如果你想学习正则表达式,我推荐Mastering Regular Expressions。它从非常基本的概念一直到讨论不同的引擎如何在下面工作。最后 4 章还为 PHP、.Net、Perl 和 Java 提供了专门的章节。我从中学到了很多,至今仍将其作为参考。

于 2008-08-19T00:00:48.580 回答
0

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

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

于 2008-08-07T16:50:51.487 回答
0

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

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

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

http://www.regexbuddy.com/

于 2008-08-07T17:10:14.083 回答
0

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

例如,我可能会使用正则表达式来查找填充在日志文件中的 Oracle 消息。不可能知道消息在哪里——只能知道它们的样子。因此,正则表达式是该问题的最佳解决方案。当您使用关系数据库时,数据通常是预先结构化的,因此正则表达式在这种情况下不会大放异彩。

于 2008-08-18T23:54:10.340 回答
0

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

查找所有出现的带有非默认参数的“routineName”:

例程名称\(:a+\)

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

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

\#如果。_调试*

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

于 2008-08-25T11:37:16.177 回答
0

验证强密码

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

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$
于 2009-09-17T09:00:25.187 回答