使用正则表达式从字符串中提取数字和符号

Posted

技术标签:

【中文标题】使用正则表达式从字符串中提取数字和符号【英文标题】:Using regex to extract numbers and symbols from string 【发布时间】:2015-12-27 15:32:35 【问题描述】:

我有一个包含文本、数字和符号的字符串。我试图从字符串中提取数字和符号,但成功有限。而不是得到整个数字和符号,我只得到它的一部分。我将在下面解释我的正则表达式,使其更清晰,更容易理解。

\d : any number
[+,-,*,/,0-9]+ : 1 or more of any +,-,*,/, or number
\d : any number

代码:

$string = "text 1+1-1*1/1= text";

$regex = "~\d[+,-,*,/,0-9]+\d~siU";
preg_match_all($regex, $string, $matches); 

echo $matches[0][0];

预期结果

1+1-1*1/1

实际结果

1+1

【问题讨论】:

比您的previous question 有了很大的改进。祝你好运。 把那个东西扔进:regex101.com 看看右上框 @Rizier123 你看到了吗? \d : 任意数 [+,-,,/,0-9]+ : 1 个或多个任意 +,-,,/ 或数字 \d : 任意数 @jessica 是的,我看到了。现在你可能想把你的正则表达式 ^^ 扔进去看看它到底做了什么 正如我在上面所说的那样。您是否看到了预期的结果,以及上面粗体显示的实际结果?这就是结果。在 regex101 中相同。 【参考方案1】:

删除 U 标志。这导致 + 在匹配中不贪婪。此外,您的字符列表中的字符之间不需要逗号。 (如果你想匹配它,你只需要 1 个,。你确实需​​要转义-,这样它就不会认为你在尝试创建一个范围

【讨论】:

:) 最后。发现问题的人!在上面的正则表达式中,似乎 siU 是完全没有必要的。感谢您指出这一点。 @jessica np。它真的仍然适用于逗号吗? (以前从未尝试过,无法通过我的手机进行测试 没有。正如@dxdy 指出的那样,我已经删除了逗号,因为逗号是问题的一部分。但我认为 siU 是问题的主要部分,并且由于您同时处理了逗号和 siU,因此您有最佳答案。 @jessica 我告诉过你你删除了'U'标志,但我认为你完全忽略了'摆脱'U'标志”...... @vinxce 当您说“对于这样的小事......”时,不清楚 U 标志是问题所在。将其编辑为您的答案并投赞成票【参考方案2】:

这里的问题是您的正则表达式确实混淆了很多未转义的元字符。在你的角色类中,你有[+,-,*,/,0-9]。您不需要用逗号分隔不同的字符,这只会告诉正则表达式引擎在您的表达式中包含逗号。此外,您需要转义 -,因为它在字符类中具有特殊含义。实际上,它将被解释为从“,”到“,”的字符,而不是文字字符“-”。 “/”字符也存在类似问题。表达式 \d[+\-*/0-9]+\d 应该可以解决问题。

【讨论】:

...你的眼睛在误导你...我确实已经在末尾加了一个 + 号。 我的眼睛确实在误导我。对于那个很抱歉。问题出在其他地方,请查看编辑后的答案。 据我所知,元字符不需要在 [] 括号内转义。 大部分没有,但有些确实有。其中有\ ^ ] -。考虑一下,引擎应该如何知道0-9 是指“0 到 9 的字符”还是“0、- 和 9 的字符”。 不幸的是,语法不能这样工作。与文档中的this 页面进行比较。它明确指出“减号(连字符)可用于指定字符类中的字符范围。例如,[dm] 匹配 d 和 m 之间的任何字母,包括 d 和 m。如果类中需要减号,它必须用反斜杠转义或出现在不能被解释为指示范围的位置,通常作为类中的第一个或最后一个字符。"【参考方案3】:

没有用您的代码对其进行测试,但应该可以工作:)

((?:[0-9]+[\+|\-|\*|\/]?)+)

更多细节,如果你想了解我的模式:https://regex101.com/r/mF0zO8/2

【讨论】:

对于像这样的小字符串,你可以去掉 U 标志:) 您似乎完全忽略了“它不起作用”的评论。

以上是关于使用正则表达式从字符串中提取数字和符号的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中提取所有表情符号的正则表达式是啥?

使用 sed 和正则表达式从字符串中提取数字

从字符串中提取分数、小数和数字的正则表达式[关闭]

java正则表达式,要求字符串只能包含数字、英文大小写、以及“-”符号

使用java创建正则表达式以从字符串中提取4位数字

c# 正则表达式提取()中的值