【问题标题】:Regular expression doesn't match a string at the end of file正则表达式与文件末尾的字符串不匹配
【发布时间】:2014-06-17 03:34:07
【问题描述】:

我有一个用于搜索电子邮件的正则表达式:

\b([a-z]\w{1,13}\.)?([a-z]\w{1,13})@([a-z]\w{1,13}\.){1,5}(com|de|sng|hkg|net|appl|it|lu|mc|sg|us|hk|ch)(\b|$|\z|\Z|\n)


它适用于不在文件末尾的字符串,但是当我将带有电子邮件格式的字符串放在文件末尾时,它无法检测到电子邮件。请帮助纠正这个正则表达式。任何帮助都会很棒。
我尝试测试的文本:


NX_LOCAL_HOST=@@XXXXXX@@
NX_USER=@@YYYYYY@@
NX_SLUMP_HOST=@@NX_SLUMP_HOST@@
NX_SLUMP_NAME=2100
nhbigshow@yahoo.com
NX_MGR_PORTNUM=2300
NX_KEY=0x4E580000
NX_SERVER=@@NX_SERVER@@
@NX_JRE_INSTALL_DIR=@@NX_JRE_INSTALL_DIR_HOLA_NX@@


DKBO609 @NX_JRE_INSTALL_DIR=@@NX_JRE_INSTALL_DIR_HOLA_28@@


NX_DOMSRVR_NAME=ANY_DE
! @NX_NOFASTCHAN=2013 年 6 月 6 日星期四 11:54:17 已卸载
NX_LOG=$NX_LOCAL/日志
NX_SITE=$NX_LOCAL/站点
@NX_PREFERENCE_DIR=H:\USPSD
anhbigshow@yahoo.com
C:\abc\def
anhbigshow@gmail.com


只匹配“nhbigshow@yahoo.com”。

【问题讨论】:

  • 你的文件行尾是为 windows、mac 还是 unix 配置的?
  • 你用的是什么程序?你用的是什么输入法?您确定正则表达式与不在文件末尾的字符串匹配吗?
  • 你的文件是什么样子的?
  • @AmalMurali aduch 和 iamnotmaynard 向您提出这些问题的一个原因是正则表达式本身匹配(请参阅 demo)。所以这些关于你的环境的问题很重要。
  • 你说第一个nhbigshow@yahoo.com不匹配?

标签: regex


【解决方案1】:

我假设您使用的是 python。如果是这种情况,您的 regex 将与 findall 一起使用

>>> string
'NX_LOCAL_HOST=@@XXXXXX@@ \nNX_USER=@@YYYYYYY@@ \nNX_SLUMP_HOST=@@NX_SLUMP_HOST@@        \nNX_SLUMP_NAME=2100 \nnhbigshow@yahoo.com \nNX_MGR_PORTNUM=2300 \nNX_KEY=0x4E580000 \nNX_SERVER=@@NX_SERVER@@ \n@NX_JRE_INSTALL_DIR=@@NX_JRE_INSTALL_DIR_HOLA_NX@@\n\n\nDKBO609 @NX_JRE_INSTALL_DIR=@@NX_JRE_INSTALL_DIR_HOLA_28@@\n\n\nNX_DOMSRVR_NAME=ANY_DE \n! @NX_NOFASTCHAN=Deinstalled Thu Jun 06 11:54:17 2013 \nNX_LOG=$NX_LOCAL/log \nNX_SITE=$NX_LOCAL/site \n@NX_PREFERENCE_DIR=H:\\USPSD \nanhbigshow@yahoo.com \nC:\x07bc\\def \nanhbigshow@gmail.com'
>>> regex = re.findall(r"\b([a-z]\w{1,13}\.)?([a-z]\w{1,13})@([a-z]\w{1,13}\.){1,5}(com|de|sng|hkg|net|appl|it|lu|mc|sg|us|hk|ch)(\b|$|\z|\Z|\n)",s)
>>> regex
[('', 'nhbigshow', 'yahoo.', 'com', ''), ('', 'anhbigshow', 'yahoo.', 'com', ''), ('', 'anhbigshow', 'gmail.', 'com', '')]

【讨论】:

  • 我正在使用 C#。你能用c#解释一下吗?它只匹配第一种情况
  • 我不知道C#。必须有某种方法来搜索C# 中的所有匹配项。
【解决方案2】:

如果您举例说明它匹配和不匹配的内容,将会有所帮助。如果您要匹配必须以X 结尾的内容,则表达式为X$。您很可能会在这里找到答案: http://en.wikipedia.org/wiki/Regular_expression 我有时会自己去那里作为复习。这是一个非常详细的指南。

作为一个测试,看看它是否可以只匹配最后一部分。我感觉您正在寻找的是每个项目以 (com|de|sng|hkg|net|appl|it|lu|mc|sg|us|hk|ch) 结尾,然后是一些表示行尾的分隔符。试试这个:

.*(com|de|sng|hkg|net|appl|it|lu|mc|sg|us|hk|ch)([^a-zA-Z]|$)

我用问号表示它是可选的。括号表示该集合中的 1 个项目将在那里。让我知道这是否有帮助。 .* 表示“任何字符”都可以出现“0 次或多次”。

您要查找的内容应该与此类似。这是来自评论中的链接。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|
biz|info|mobi|name|aero|asia|jobs|museum)\b

【讨论】:

  • OP 已经在使用(\b|$|\z|\Z|\n),其中should work。我不认为[\b\z\Z\n]?$ 是正确的(或者会起作用),因为$ 永远不会在\Z 之后发生。
  • 你在哪里使用正则表达式? Java,VB,...?每个库都非常不同,每个库都有很多特殊功能。
  • 哦,一定是Perl。由于您正在寻找电子邮件地址,请查看此内容。 regular-expressions.info/email.html 和 RFC 5322。您可以仔细检查电子邮件部分是否正确。使用 ([^a-zA-Z]|$) 应该足以表明字符串的 .com/.edu/.de 部分已经结束。我会尽可能避免使用 \b 和 \z,但这只是我个人的偏好,以避免意外功能。
  • 我正在使用 c#。它只匹配第一种情况。
  • 如果不自己测试,接下来就是尝试修改您的示例,看看是否可以让“nhbigshow@yahoo.com”停止匹配并让“anhbigshow@gmail.com”开始匹配。你可能会弄清楚问题出在哪里。那里可能有一个您看不到的 Unicode 字符或其他错误。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多