Questions tagged «regular-expressions»

根据Wikipedia的说法,正则表达式(缩写为regex或regexp)是形成搜索模式的字符序列,主要用于与字符串的模式匹配或字符串匹配(即类似“查找和替换”的操作)。


10
正则表达式语法设计的可读性差是否有特定原因?
程序员似乎都同意,代码的可读性比起短语法的单行代码要重要得多,但是单行代码可以工作,但是需要高级开发人员以任何程度的精度进行解释-但这似乎正是正则表达式设计的方式。有这个原因吗? 大家都同意,那selfDocumentingMethodName()比更好e()。为什么这也不适用于正则表达式? 在我看来,与其设计没有结构组织的单行逻辑语法,不如: var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; 而且这甚至不是URL的严格解析! 取而代之的是,我们可以使一些流水线结构井井有条,可读性强,这是一个基本示例: string.regex .isRange('A-Z' || 'a-z') .followedBy('/r'); 除了最短的运算和逻辑语法外,正则表达式的极为简洁的语法还有什么优势?归根结底,正则表达式语法设计的可读性差是否有特定的技术原因?

25
一个人应该多远进行一次电子邮件地址验证?
我想知道人们应该花多长时间验证电子邮件地址。我的领域主要是网络开发,但这适用于任何地方。 我看过几种方法: 只需检查是否存在“ @”,这很简单,但当然不是那么可靠。 用于标准电子邮件格式的更复杂的正则表达式测试 一个针对RFC 2822的完整正则表达式 -问题在于通常一个电子邮件地址可能是有效的,但它可能不是用户的意思 DNS验证 SMTP验证 正如许多人可能知道(但许多人却不知道)一样,电子邮件地址可能具有很多人通常不考虑的许多奇怪变化(请参阅RFC 2822 3.4.1),但是您必须考虑以下目标:您的验证:您只是在尝试确保可以将电子邮件发送到某个地址,或者是用户可能要输入的电子邮件(在很多其他晦涩的情况下,否则“有效”是不可能的)的地址)。 我考虑过的一个选项只是用一个更加深奥的地址发出警告,但仍然允许请求通过,但这确实增加了表单的复杂性,并且大多数用户很可能会感到困惑。 虽然DNS验证/ SMTP验证似乎很容易,但我可以预见到DNS服务器/ SMTP服务器暂时关闭且用户无法在某处注册,或者用户的SMTP服务器不支持所需功能的问题。 一些经验丰富的开发人员将如何处理此问题?除了我列出的方法以外,还有其他方法吗? 编辑:我完全忘记了最显而易见的一切,发送确认电子邮件!感谢答复者指出这一点。是的,这很简单,但是涉及的每个人确实需要额外的麻烦。用户必须获取一些电子邮件,开发人员需要在甚至确认用户数据有效之前记住用户数据。

23
每个程序员都必须学习正则表达式吗?[关闭]
我是编程新手,在一次采访中我遇到了一个关于正则表达式的问题;不用说我无法回答。所以我想知道我是否应该学习正则表达式?所有领域的每个程序员都必须这样做吗?还是对某些特定领域进行编程是必须的? 相关问题: 为什么正则表达式如此令人着迷? 什么时候不应该使用正则表达式?

18
您如何学习正则表达式?[关闭]
我不是问在哪里学习。我在网上找到了很多很好的资源,还有书籍等。 但是,我该如何解决这些问题。起点在哪里,终点在哪里?regexp处理器何时在文本上前进,何时保持立场并尝试其他匹配?等等 我想尝试找出埃及金字塔上的象形文字。

11
可读的正则表达式又不会失去其功能?
如今,许多程序员都知道快速编写正则表达式的乐趣,这些天通常是在某些Web服务的帮助下,或更传统的是在交互式提示下,或者编写一个正在开发正则表达式的小脚本以及一系列测试用例。 。无论哪种情况,该过程都是迭代的并且相当快:不断破解看起来像神秘的字符串,直到它匹配并捕获您想要的内容,然后拒绝您不需要的内容。 对于一个简单的情况,结果可能是这样的,例如Java regexp: Pattern re = Pattern.compile( "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$" ); 许多程序员还知道需要编辑正则表达式或仅在遗留代码库中围绕正则表达式进行编码的痛苦。经过一些编辑后,对于熟悉regexp的任何人来说,regexp仍然很容易理解,regexp的资深人士应立即查看其功能(如果有人想要练习,请在帖子末尾回答自己弄清楚)。 但是,将正则表达式变成真正的只写对象并不需要变得更加复杂,即使有了勤奋的文档(每个人当然会对他们编写的所有复杂正则表达式都执行此操作……),修改正则表达式就变成了艰巨的任务。如果未对regexp进行仔细的单元测试(这当然也是每个人对其所有复杂的regexp的肯定和否定都有全面的单元测试...),这也可能是非常危险的任务。 因此,长话短说,是否存在不损失正则表达式的读写解决方案/替代方案?上面的正则表达式在替代方法下的外观如何?任何语言都可以,尽管最好使用多语言解决方案,但正则表达式是多语言的。 然后,较早的regexp所做的就是这样:解析格式为数字的字符串1:2:3.4,捕获每个数字,其中允许空格,并且只3需要空格。

5
什么时候不应该使用正则表达式?[关闭]
正则表达式是程序员的强大工具,但是-在某些情况下,它们不是最佳选择,甚至是完全有害的。 简单的示例1是使用regexp解析HTML-已知的众多错误之路。通常,这也可能归因于解析。 但是,还有其他显然不能使用正则表达式的区域吗? ps:“ 您要提出的问题似乎是主观的,很可能已经解决。 ”-因此,我想强调一点,就是我对使用正则表达式会导致问题的示例感兴趣。

6
是否应该对复杂的正则表达式进行单元测试?
我应该在应用程序中为复杂的正则表达式编写单元测试吗? 一方面:它们易于测试,因为输入和输出格式通常很简单且定义明确,而且它们往往变得如此复杂,因此对它们的测试特别有价值。 另一方面:它们本身很少是某个单元界面的一部分。最好只测试接口,然后以隐式测试正则表达式的方式进行操作。 编辑: 我同意布朗博士的意见,他在评论中指出这是内部组件单元测试的特例。 但是正则表达式作为内部组件具有一些特殊特征: 没有真正的单独模块,单行正则表达式可能非常复杂。 正则表达式将输入映射到输出而没有任何副作用,因此真正易于单独测试。

7
正则表达式实际上是如何工作的?
假设您有一份书面论文的文件。您想分析这篇文章,仅选择某些单词。凉。 使用正则表达式是否比逐行逐单词地查找匹配项更快?如果是这样,它如何运作?您如何比查看每个单词更快?

4
正则表达式是一种编程语言吗?
从学术意义上讲,正则表达式是否可以用作编程语言? 我好奇的动机是我刚刚看了一个SO问题,问“正则表达式可以X吗?”。这让我想知道,对于使用它们的可能解决方案,可以从一般意义上说什么。 我基本上是在问,“图灵正则表达式是否完整”?

17
为什么正则表达式如此令人着迷?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 图表1,图表2,我想您会很难回想起其他示例。 问题是:如果有多种方法可以解决问题,PHP程序员(我通常在StackOverflow上浏览PHP标记)将寻求有关正则表达式的解决方案的帮助。 即使经济性较差,当不需要花哨的替换规则时,即使 php手册建议(link)str_replace代替任何preg_*或ereg_*函数使用,也是如此。 有人知道为什么会这样吗? 别误会我的意思,我最好的朋友中有一些是正则表达式,我也不鄙视Perl。我没有得到的是为什么即使在过度杀伤很明显(正则表达式切换字符串)或代码复杂性呈指数增长(正则表达式用于从PHP中的 html获取数据)的情况下,也没有寻找替代方法的原因

5
CSV格式可以由正则表达式定义吗?
我和一位同事最近就纯正则表达式是否能够完全封装csv格式进行了争论,以便它能够使用任何给定的转义字符,引号字符和分隔符char解析所有文件。 正则表达式不必在创建后就可以更改这些字符,但在任何其他情况下都不能失败。 我认为,这对于令牌生成器来说是不可能的。唯一能够做到这一点的正则表达式是一种非常复杂的PCRE样式,它不仅限于标记化。 我正在寻找以下方面的东西: ... csv格式是上下文无关的语法,因此,不可能仅使用正则表达式进行解析... 还是我错了?是否可以仅使用POSIX正则表达式来解析csv? 例如,如果转义字符和引号字符均为",则这两行都是有效的csv: """this is a test.""","" "and he said,""What will be, will be."", to which I replied, ""Surely not!""","moving on to the next field here..."

7
我应该重构主要由一个正则表达式组成的大型函数吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我刚刚编写了一个跨越约100行的函数。听到这个消息,您可能很想告诉我有关单一责任的事,并敦促我进行重构。这也是我的直觉,但这是问题所在:函数做一件事。它执行复杂的字符串操作,并且函数主体主要由一个详细的正则表达式组成,分为许多行,并记录在案。如果我将正则表达式分解为多个功能,我会感觉实际上会失去可读性,因为我正在有效地切换语言,并且无法利用正则表达式提供的某些功能。现在是我的问题: 在使用正则表达式进行字符串操作时,大型函数体是否仍然是反模式?似乎命名捕获组的作用与功能非常相似。顺便说一下,我对通过正则表达式的每个流进行测试。

6
正则表达式可以/应该做什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我最近学习了正则表达式,并且喜欢编写/使用它们。我正在寻找想法并有更多机会使用它们,但是,我不想像人们经常警告的那样将它们作为通用工具过度使用。 我应该为正则表达式使用什么类型的东西,在哪里不应该使用正则表达式?(除了显而易见的部分:HTML解析)。

1
Java正则表达式模式-编译时间常数还是实例成员?
当前,我有几个单例对象,它们在正则表达式上进行匹配,并且Patterns的定义如下: class Foobar { private final Pattern firstPattern = Pattern.compile("some regex"); private final Pattern secondPattern = Pattern.compile("some other regex"); // more Patterns, etc. private Foobar() {} public static Foobar create() { /* singleton stuff */ } } 但是前几天有人告诉我这是不好的风格,Pattern应该始终在类级别定义s ,而看起来像这样: class Foobar { private static final Pattern FIRST_PATTERN = Pattern.compile("some regex"); …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.