特定正则表达式在R中不起作用

特定正则表达式在R中不起作用,r,regex,R,Regex,我试图找出是否有一个字符串模式;它是有效的。但它在R工作室里不起作用 #Pattern 2 s1 = "((5.0 - 50.0) - 15.0)" s2 = "(15.0 - (5.0 - 50.0))" #Regex grep("^.*\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*$", s1) 简明的 为了解释为什么我对你的正则表达式做了这么多修改,我实际上只是重写了它 您使用{1}。虽然这是有效的,但它是多余的,因

我试图找出是否有一个字符串模式;它是有效的。但它在R工作室里不起作用

#Pattern 2
s1 = "((5.0 - 50.0) - 15.0)"
s2 = "(15.0 - (5.0 - 50.0))"

#Regex
grep("^.*\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*$", s1)
简明的 为了解释为什么我对你的正则表达式做了这么多修改,我实际上只是重写了它

您使用{1}。虽然这是有效的,但它是多余的,因此可以删除{1}。 您不需要转义列表中的每个字符,只需转义特定的字符,即斜杠和连字符,但仅当字符不在集合的开始/结束处或范围之后时才转义连字符-因此我将其移动到集合的开始处。 您的正则表达式允许.1有效,不确定这是否是故意的,如果是,您可以根据自己的喜好编辑我的正则表达式。我只是觉得一个更正确的解决方案会迫使一个数字出现在问题之前。使得.1无效,但0.1有效。 您的模式中有重复的部分,所以我将它们更改为命名的捕获组。这使得模式可以很容易地根据您的喜好进行操作。它还允许您在一个位置而不是多个点定义图案部分。-递归 递归是我所知道的唯一一种方法,在本例中,您可以正确地确定匹配的打开/关闭标记(左括号和右括号)。我的模式中的g组处理递归。 密码 后果 输入 输出 仅匹配如下所示

(14.0 + 46.0)
((5.0 - 50.0) - 15.0)
(15.0 - (5.0 - 50.0))
解释 ?定义子模式定义构造。regex完全忽略了这一点。它被视为一个var name=value,而您可以通过它的名称调用特定的模式。 ?[-+]?\d+?:\。\d+?子模式n定义一个有效数字,如下所示 [-+]? 匹配集合中的零个或任意一个字符-+ \d+匹配任意数字一次或多次 ?:\。\d+?匹配零或一个文字点。后跟一个或多个数字 ?\s*[-+*\/]\s*子模式a定义所有有效的算术符号 \s*匹配任意数量的空白字符 [-+*\/]匹配集合中的字符-+*/ \s*匹配任意数量的空白字符 ?\?:?&n?&g?&a?:?&n?&g\匹配以下内容 \匹配文字左括号 ?:?&n |?&g匹配n或g模式递归 ?&a匹配a模式递归 ?:?&n |?&g匹配n或g模式递归 \匹配右括号 ^?&g$匹配以下内容 ^在行尾断言位置 ?&g匹配g模式递归 $Assert行末尾的位置 简明的 为了解释为什么我对你的正则表达式做了这么多修改,我实际上只是重写了它

您使用{1}。虽然这是有效的,但它是多余的,因此可以删除{1}。 您不需要转义列表中的每个字符,只需转义特定的字符,即斜杠和连字符,但仅当字符不在集合的开始/结束处或范围之后时才转义连字符-因此我将其移动到集合的开始处。 您的正则表达式允许.1有效,不确定这是否是故意的,如果是,您可以根据自己的喜好编辑我的正则表达式。我只是觉得一个更正确的解决方案会迫使一个数字出现在问题之前。使得.1无效,但0.1有效。 您的模式中有重复的部分,所以我将它们更改为命名的捕获组。这使得模式可以很容易地根据您的喜好进行操作。它还允许您在一个位置而不是多个点定义图案部分。-递归 递归是我所知道的唯一一种方法,在本例中,您可以正确地确定匹配的打开/关闭标记(左括号和右括号)。我的模式中的g组处理递归。 密码 后果 输入 输出 仅匹配如下所示

(14.0 + 46.0)
((5.0 - 50.0) - 15.0)
(15.0 - (5.0 - 50.0))
解释 ?定义子模式定义构造。regex完全忽略了这一点。它被视为一个var name=value,而您可以通过它的名称调用特定的模式。 ?[-+]?\d+?:\。\d+?子模式n定义一个有效数字,如下所示 [-+]? 匹配集合中的零个或任意一个字符-+ \d+匹配任意数字一次或多次 ?:\。\d+?匹配零或一个文字点。后跟一个或多个数字 ?\s*[-+*\/]\s*子模式a定义所有有效的算术符号 \s*匹配任意数量的空白字符 [-+*\/]匹配集合中的字符-+*/ \s*匹配任意数量的空白字符 ?\?:?&n?&g?&a?:?&n?&g\匹配以下内容 \匹配文字左括号 ?:?&n |?&g匹配n或g模式递归 ?&a匹配a模式递归 ?:?&n |?&g匹配n或g模式递归 \匹配右括号 ^?&g$匹配以下内容 ^在行尾断言位置 ?&g匹配g模式递归 $Assert行末尾的位置 请注意,在正则表达式的两端添加。*是危险的,因为。*是贪婪的,将匹配任何字符。你可以附加?因为grep在字符串的任何部分搜索任何匹配项,所以它使。*变懒或删除。*。要回答您的问题,似乎必须启用perl才能使grep正确匹配:

#Pattern 2
s1 = "((5.0 - 50.0) - 15.0)"
s2 = "(15.0 - (5.0 - 50.0))"

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1)
# integer(0)

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1)
# integer(0)

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1, perl = TRUE)
# [1] 1

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1, perl = TRUE)
# [1] 1
正如@ctwheels所指出的,这将匹配在字符串的任何位置具有该模式的任何字符串。因此,这不用于验证字符串是否仅包含有效字符。见@ct wheels是后一种情况的答案。

请注意,在正则表达式的两端添加。*是危险的,因为。*是贪婪的,将匹配任何字符。你可以附加?因为grep在字符串的任何部分搜索任何匹配项,所以它使。*变懒或删除。*。要回答您的问题,似乎必须启用perl才能使grep正确匹配:

#Pattern 2
s1 = "((5.0 - 50.0) - 15.0)"
s2 = "(15.0 - (5.0 - 50.0))"

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1)
# integer(0)

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1)
# integer(0)

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1, perl = TRUE)
# [1] 1

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1, perl = TRUE)
# [1] 1


正如@ctwheels所指出的,这将匹配在字符串的任何位置具有该模式的任何字符串。因此,这不用于验证字符串是否仅包含有效字符。关于后一种情况,请参见@ctwheels的答案。

什么是不工作的确切含义?期望的输出是什么?你到底想匹配什么?不起作用意味着它没有检测到搜索字符串s1/s2与正则表达式中指定的模式匹配。但是你没有用文字描述你想匹配什么。根据另一个正则表达式测试程序,缺少括号。对此表示抱歉。我修改了这个问题。括号是个打字错误。我的表达式在^.*-?\d*\.\d{1}\s[\+\-*\/]\s-?\d*\.\d{1}.*$中是正确的,但在R中仍然不起作用。不起作用的确切含义是什么?期望的输出是什么?你到底想匹配什么?不起作用意味着它没有检测到搜索字符串s1/s2与正则表达式中指定的模式匹配。但是你没有用文字描述你想匹配什么。根据另一个正则表达式测试程序,缺少括号。对此表示抱歉。我修改了这个问题。括号是个打字错误。我的表达式在^.*-?\d*\.\d{1}\s[\+\-*\/]\s-?\d*\.\d{1}.*$中是正确的,但在R中仍然不起作用。@ctwheels感谢您的详细回答。它看起来和我的很不一样。你的意思是我写它的方式是错误的,这就是它不起作用的原因吗?或者这是另一个答案?@SriniShine请看我刚刚添加到我的answer@ctwheels非常感谢你。你的答案很简洁!然而,我想找出我的正则表达式不起作用的原因,用户提供了解决方案。所以我接受了他的答案。再次感谢您简洁的回答。@ctwheels感谢您详细的回答。它看起来和我的很不一样。你的意思是我写它的方式是错误的,这就是它不起作用的原因吗?或者这是另一个答案?@SriniShine请看我刚刚添加到我的answer@ctwheels非常感谢你。你的答案很简洁!然而,我想找出我的正则表达式不起作用的原因,用户提供了解决方案。所以我接受了他的答案。再次感谢你简洁的回答。谢谢你的回答。但是,模式1的前一个regex在没有启用perl的情况下工作。@ctwheels带。*的是我的解决方案。正则表达式在表达式检查器中起作用,但在R中不起作用。但当我打开perl时,它确实起作用了。@ctwheels我想看看给定字符串中是否存在该模式。我想找出为什么我写的正则表达式我承认它不是最有效的一个,在正则表达式计算器中有效,但在R中无效。这个答案确保字符串中存在1.1-1.1形式的模式。该模式不验证该模式的嵌套,只检查其在给定字符串中的存在性。如果这是目的,请使用此答案。如果目的是验证字符串,请不要使用此答案。有关验证或嵌套验证,请参见。谢谢您的回答。但是,模式1的前一个regex在没有启用perl的情况下工作。@ctwheels带。*的是我的解决方案。正则表达式在表达式检查器中起作用,但在R中不起作用。但当我打开perl时,它确实起作用了。@ctwheels我想看看给定字符串中是否存在该模式。我想找出为什么我写的正则表达式我承认它不是最有效的一个,在正则表达式计算器中有效,但在R中无效。这个答案确保字符串中存在1.1-1.1形式的模式。该模式不验证该模式的嵌套,只检查其在给定字符串中的存在性。如果这是目的,请使用此答案。如果目的是验证字符串,请不要使用此答案。有关验证或嵌套验证,请参见。
(14.0 + 46.0)
((5.0 - 50.0) - 15.0)
(15.0 - (5.0 - 50.0))
#Pattern 2
s1 = "((5.0 - 50.0) - 15.0)"
s2 = "(15.0 - (5.0 - 50.0))"

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1)
# integer(0)

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1)
# integer(0)

grep("^.*?\\(-?\\d*\\.\\d{1}\\s[\\+\\-\\*\\/]\\s-?\\d*\\.\\d{1}\\).*?$", s1, perl = TRUE)
# [1] 1

grep("\\(-?\\d+\\.\\d\\s[\\+\\-\\*\\/]\\s-?\\d+\\.\\d\\)", s1, perl = TRUE)
# [1] 1