Regex 正则表达式中的匹配条件

Regex 正则表达式中的匹配条件,regex,normalization,street-address,Regex,Normalization,Street Address,只是提前提醒一下:我是一个有点雷杰克斯新手。也许这个问题的一个好答案是将我与一个资源联系起来,该资源解释了这些条件是如何工作的:) 假设我有一个街道名称,比如23街或5街。我想去掉“th”、“rd”、“nd”和“St”。如何做到这一点 现在我有一个表达式:(st | nd | rd | th)。问题是,它还将匹配包含“st”、“nd”、“rd”或“th”的街道名称。所以我真正需要的是一个条件匹配,它在自身之前寻找至少一个数字(即:第一个而不是街道) 谢谢大家! 尝试使用此正则表达式: (\d+)

只是提前提醒一下:我是一个有点雷杰克斯新手。也许这个问题的一个好答案是将我与一个资源联系起来,该资源解释了这些条件是如何工作的:)

假设我有一个街道名称,比如23街或5街。我想去掉“th”、“rd”、“nd”和“St”。如何做到这一点

现在我有一个表达式:(st | nd | rd | th)。问题是,它还将匹配包含“st”、“nd”、“rd”或“th”的街道名称。所以我真正需要的是一个条件匹配,它在自身之前寻找至少一个数字(即:第一个而不是街道)

谢谢大家!

尝试使用此正则表达式:

(\d+)(?:st|nd|rd|th)
我不认识鲁比。在PHP中,我将使用如下内容:

preg_replace('/(\d+)(?:st|nd|rd|th) /', '$1', 'South 2nd Street');
要删除后缀,请尝试使用此正则表达式:

(\d+)(?:st|nd|rd|th)
我不认识鲁比。在PHP中,我将使用如下内容:

preg_replace('/(\d+)(?:st|nd|rd|th) /', '$1', 'South 2nd Street');

要删除后缀

听起来你只是想匹配顺序后缀(st | nd | rd | th),是吗

如果您的正则表达式引擎支持它,您可以使用


/(?听起来你只是想匹配顺序后缀(st | nd | rd | th),是吗

如果您的正则表达式引擎支持它,您可以使用


/(?你真正想要的是锚

尝试全局替换:

\b(\d+)(?:st|nd|rd|th)\b
第一组

说明:

  • \b
    -->匹配一个位置,其中一个单词字符(数字、字母、下划线)后跟一个非单词字符(前一组中的任何一个字符),或者相反
  • (\d+)
    -->匹配一个或多个数字,并在第一组中捕获它们($1)
  • (?:st | nd | rd | th)
    -->匹配任何
    st
    等…不捕获它(
    (?:…)
    是非捕获组)
  • \b
    -->见上文
使用perl的演示:

$ perl -pe 's/\b(\d+)(?:st|nd|rd|th)\b/$1/g' <<EOF
> Mark, 23rd street, New Hampshire
> I live on the 7th avenue
> No match here...
> azoiu32rdzeriuoiu
> EOF
Mark, 23 street, New Hampshire
I live on the 7 avenue
No match here...
azoiu32rdzeriuoiu
我住在第七大道 >这里没有对手。。。 >偶氮 >EOF 马克,新罕布什尔州23街 我住在7号大街 这里没有对手。。。 偶氮
你真正想要的是锚

尝试全局替换:

\b(\d+)(?:st|nd|rd|th)\b
第一组

说明:

  • \b
    -->匹配一个位置,其中一个单词字符(数字、字母、下划线)后跟一个非单词字符(前一组中的任何一个字符),或者相反
  • (\d+)
    -->匹配一个或多个数字,并在第一组中捕获它们($1)
  • (?:st | nd | rd | th)
    -->匹配任何
    st
    等…不捕获它(
    (?:…)
    是非捕获组)
  • \b
    -->见上文
使用perl的演示:

$ perl -pe 's/\b(\d+)(?:st|nd|rd|th)\b/$1/g' <<EOF
> Mark, 23rd street, New Hampshire
> I live on the 7th avenue
> No match here...
> azoiu32rdzeriuoiu
> EOF
Mark, 23 street, New Hampshire
I live on the 7 avenue
No match here...
azoiu32rdzeriuoiu
我住在第七大道 >这里没有对手。。。 >偶氮 >EOF 马克,新罕布什尔州23街 我住在7号大街 这里没有对手。。。 偶氮
要删除序号:

 /(\d+)(?:st|nd|rd|th)\b/$1/
您必须捕获数字,以便用它替换匹配项。您可以捕获序数,也可以不捕获序数,除非您想将其输出到其他地方

要删除序号,请执行以下操作:

 /(\d+)(?:st|nd|rd|th)\b/$1/
您必须捕获数字,以便用它替换匹配项。您可以捕获序数,也可以不捕获序数,除非您想将其输出到其他地方



提示:在数字后搜索这些单词。尝试了此操作,但最终匹配的是整个字符串,而不仅仅是我要删除的前一个缩写。提示2:在(st | nd | rd | th)后添加空格 :P@EricR如何执行您想要执行的操作在一定程度上取决于使用正则表达式的编程语言。尝试了解子模式的工作原理。请参阅提示:在数字后搜索这些单词。尝试了此操作,但最终匹配的是整个字符串,而不仅仅是我要删除的前一个缩写。hint2:在后面添加空格(圣德街第四街):P@EricR你想怎么做取决于你使用正则表达式的编程语言。试着学习子模式是如何工作的。看看问题:它将匹配
aziou32rdzeriuoiu
@fge True。为了避免这种情况,你认为它前面有空格然后只有数字(例如,
(?@fge这不是问题。他说如果前面有数字,他只想匹配
st | nd | rd | th
。这就是假设他使用的正则表达式引擎支持lookbehinds的情况。真的有一条街道的名称中有数字,前后都有字母吗?@user1不,OP说他想摆脱这个问题 suffix@fge是的,您可以;将上述正则表达式的所有匹配项替换为空字符串:
。问题:它将匹配
aziou32rdzeriuoiu
@fge True。为了防止出现这种情况,您认为可以安全地假设它前面有空格,然后只有数字(例如,
(?@fge这不是问题。他说如果前面有数字,他只想匹配
st | nd | rd | th
。这就是假设他使用的正则表达式引擎支持lookbehinds的情况。真的有一条街道的名称中有数字,前后都有字母吗?@user1不,OP说他想摆脱这个问题 suffix@fge是,您可以;将上述正则表达式的所有匹配项替换为空字符串:
“”
。这将在字符串开头失败,并且在大约一半未实现lookbehind的语言中不起作用。与其使用空格lookbehind,不如使用另一个边界锚点
\b
?我正要编辑解决方案以包含\b,但分心了:p编辑…这是删除整个街道名称(即,第4个)。如果按照说明替换为第一组,则不会!这将在字符串开头失败,并且在大约一半未实现lookback的语言中不起作用。为什么不使用另一个边界锚点
\b
?我正要编辑解决方案以包含\b,但得到了distrac