我主要在访问 Oracle 数据库的 Java 桌面应用程序方面工作了 5 年,我从未使用过正则表达式。现在我进入 Stack Overflow,我看到了很多关于它们的问题;我觉得我错过了什么。
你用正则表达式做什么?
PS对不起我的英语不好
我主要在访问 Oracle 数据库的 Java 桌面应用程序方面工作了 5 年,我从未使用过正则表达式。现在我进入 Stack Overflow,我看到了很多关于它们的问题;我觉得我错过了什么。
你用正则表达式做什么?
PS对不起我的英语不好
正则表达式(或正则表达式)用于在字符串中进行模式匹配。因此,您可以从一段文本中提取所有电子邮件地址,因为它遵循特定的模式。
在某些情况下,正则表达式包含在正斜杠中,并且在第二个斜杠之后放置诸如不区分大小写之类的选项。这是一个很好的:)
/(bb|[^b]{2})/i
口语可以读作“2 be or not 2 be”。
第一部分是(括号),它们被管道分割 | 等同于 or 语句的字符,因此 (a|b) 匹配“a”或“b”。管道区域的前半部分与“bb”匹配。后半部分的名字我不知道,但它是方括号,它们匹配任何不是“b”的东西,这就是为什么那里有一个屋顶符号 thingie(技术术语)。波浪形的括号匹配它们之前的事物的计数,在这种情况下,两个字符不是“b”。
在第二个 / 之后是一个“i”,这使得它不区分大小写。开始和结束斜线的使用是特定于环境的,有时你会这样做,有时你不会。
我认为您会发现这两个链接很方便
考虑 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]
在这里,正则表达式中的括号标记了一个捕获组,因此您可以准确看到您匹配的数据是什么,以便您进行进一步处理。
这只是冰山一角......您可以在正则表达式中执行许多不同的操作,从而非常轻松地处理文本。
有史以来最酷的正则表达式:
/^1?$|^(11+?)\1+$/
它测试一个数字是否是素数。它有效!
注意:要使其工作,需要进行一些设置;我们要测试的数字必须首先转换为“<code>1”的字符串,然后我们可以应用该表达式来测试该字符串是否包含“<code>1”的素数:
def is_prime(n)
str = "1" * n
return str !~ /^1?$|^(11+?)\1+$/
end
在Avinash Meetoo 的博客上有一个详细且非常平易近人的解释。
如果你想学习正则表达式,我推荐Mastering Regular Expressions。它从非常基本的概念一直到讨论不同的引擎如何在下面工作。最后 4 章还为 PHP、.Net、Perl 和 Java 提供了专门的章节。我从中学到了很多,至今仍将其作为参考。
正则表达式(简称 regex 或 regexp)是用于描述搜索模式的特殊文本字符串。您可以将正则表达式视为类固醇上的通配符。您可能熟悉通配符符号,例如
*.txt
在文件管理器中查找所有文本文件。正则表达式等效项是.*\.txt$
.
一个很好的正则表达式资源:http ://www.regular-expressions.info
如果您刚开始使用正则表达式,我衷心推荐像 The Regex Coach 这样的工具:
http://www.weitz.de/regex-coach/
还听说过关于 RegexBuddy 的好消息:
您可能知道,Oracle 现在有正则表达式:http ://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html 。我在一些查询中使用了新功能,但它并没有在其他情况下有用。我相信,原因是正则表达式最适合查找隐藏在非结构化数据中的结构化数据。
例如,我可能会使用正则表达式来查找填充在日志文件中的 Oracle 消息。不可能知道消息在哪里——只能知道它们的样子。因此,正则表达式是该问题的最佳解决方案。当您使用关系数据库时,数据通常是预先结构化的,因此正则表达式在这种情况下不会大放异彩。
这些 RE 特定于 Visual Studio 和 C++,但我发现它们有时很有帮助:
查找所有出现的带有非默认参数的“routineName”:
例程名称\(:a+\)
相反,要查找所有出现的“routineName”,只有默认值: routineName\(\)
要在调试版本中查找启用(或禁用)的代码:
\#如果。_调试*
请注意,这将捕获所有变体:ifdef, if defined, ifndef, if !defined
验证强密码:
这将验证长度为 5 到 10 个字母数字字符的密码,其中至少有一个大写字母、一个小写字母和一个数字:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$