Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式字符串零或更多_Php_Regex_String - Fatal编程技术网

Php 正则表达式字符串零或更多

Php 正则表达式字符串零或更多,php,regex,string,Php,Regex,String,我一直关注正则表达式: (.*?)( EUR)\1* 在2mm的串上;EUR匹配2mm和欧元 但字符串2mm不匹配 但是为什么呢?我以为*意味着零次或更多次? 你能帮助我吗? 谢谢大家! 告诉你想要什么样的结果会是一个更好的方法 如果您希望正则表达式匹配“2mm;EUR”或“2mm;”,则意味着您希望匹配以某种数字开头的字符串(可能是毫秒长度?类似于此),以“;”结尾,最后后跟字符串“EUR” 如果这是您想要的,您的正则表达式应该有一个“;”内,并用“?”(0或1)标记EUR 以下正则表达式将

我一直关注正则表达式:

(.*?)( EUR)\1*
2mm的串上;EUR
匹配
2mm
欧元
但字符串
2mm不匹配

但是为什么呢?我以为
*
意味着零次或更多次? 你能帮助我吗?
谢谢大家!

告诉你想要什么样的结果会是一个更好的方法

如果您希望正则表达式匹配“2mm;EUR”或“2mm;”,则意味着您希望匹配以某种数字开头的字符串(可能是毫秒长度?类似于此),以“;”结尾,最后后跟字符串“EUR”

如果这是您想要的,您的正则表达式应该有一个“;”内,并用“?”(0或1)标记EUR

以下正则表达式将匹配这两种情况,
2mm;EUR
以及
2mm

(.*?;\s)(EUR)|(.*;)

是的,你是对的
*
表示“零次或多次”。您似乎不明白的是
\1
。它的意思是“第一组捕获的内容”

因此,正则表达式
(.*)(EUR)\1*
表示:

任何字符串,后跟四个字母
EUR
(带空格),后跟字符串开头的零倍或更多倍

如果字符串
2mm;2毫米欧元;2毫米
(.*)
将匹配
2 mm
(EUR)
将匹配
EUR
\1*
将匹配
2毫米;2毫米

现在您理解了错误,您将更容易找到正确的表达式。只需删除
\1

(.*?)( EUR)*
将匹配任何内容,后跟零次或多次
EUR

^(.*?)( EUR.*)?$

将匹配“EUR”之前的任何内容,如果缺少,则匹配整个字符串。注意,我们添加了开始和结束标记,以确保在没有EUR时捕获整个字符串

因为那串里没有
EUR
,但后面有“*”吗?表示0个或更多匹配项?量词应用于它前面的标记。在这种情况下,点
。如果您想将
EUR
设置为可选,请在
(EUR)?
之后再打一个问号<代码>?
:零次或一次。为什么有
\1*
EUR
可以多次出现吗?是的,“EUR”可以多次出现……谢谢!我希望的结果是:如果发现“EUR”比返回之前的所有内容都要多,如果没有,那么结果都是“mm”和“ar”不确定。。。唯一确定的是“欧元”,但它也可以像“4mm 7,50欧元”,这不完全是我搜索的。。。我会在(EUR)之前得到所有的东西,如果它不存在,那么返回所有的东西……两个Questes,以确保这是正确的正则表达式:如果EUR在字符串的中间,那么正确的忽略所有的内容是正确的吗?是否保证在EUR之前有一个空间。
^(.*?)( EUR.*)?$