我正在做一个练习来创建一个正则表达式,该正则表达式会根据温度过滤字符串。
想法是捕获所有具有以下结构的东西:“-0.4 F”,“ 5 C”,“-0.6 C”等等。这是我的尝试:
temp <- c("La temp es de 0.4 F", "La temp es de -5F", "nada", "tampoco nada",
"La temp es de - 0.6 C")
temp[grepl("([+-]?\\s+[0-9]+(?:\\.[0-9]*)?)\\s+([CF])$)\\1\\2", temp)]
我的推理:
[+-]?\\s*[0-9]+
允许使用可选的正号或负号(但只能是一个)以及可选的空格(不需要)和0-9之间的数字(至少需要一个)。这定义了我的第一组(?:\\.[0-9]*)?)\\s+([CF])$)
定义第二组。根据此text,(?:
表示打开括号,其中可以有一个可选组。在这种情况下,\\.[0-9]*)?
是可选组(小数点和一些数字)。然后,\\s+
定义空格(不需要),([CF])$
是字符串的结尾(强制性)。[如果我做得很好,我有两个正则表达式组,这就是为什么我使用\\1\\2
反向引用。我的代码不起作用,因此得到character(0)
。
您可以尝试:
grep('-?\\d+(\\.\\d+\\s+)?[CF]', temp, value = TRUE)
#[1] "La temp es de 0.4 F" "La temp es de -5F" "La temp es de - 0.6 C"
-?
-是可选的负号
[\\d+
-后接一个或多个数字
(\\.\\d+\\s+)?
-可选的十进制数字和空格
[[CF]
-后跟C或F。
如果是我从头开始,我将使用以下内容:
grep('\\d[^a-z]*[CF]', temp, value = TRUE)
# > [1] "La temp es de 0.4 F" "La temp es de -5F" "La temp es de - 0.6 C"
\\d
有一个数字
[[^a-zA-Z]*
后面没有a-z范围内的任何字符,而是其他任何字符
[[CF]
,最后是C或F
您有该正则表达式存在很多问题(如果我没记错的话:
您在替换中使用组而不是在匹配模式中。我不确定为什么在模式结尾处有\\1\\2
。
您有不必要的分组。因此,所需模式的不同部分将导致您只想找到它们而不是替换它们。
您假设C或F总是出现在行尾。
您还有多余的括号。
我不是专家,所以可能还有其他问题。
N。 B。使用联机解释器在这里会很有帮助,因为它们会显示/突出显示某些错误。
我从您的模式开始,并提出以下一种:
[+-]?\\s*[0-9+][\\.]?[0-9+]?\\s*[CF]
这里是regex demo,它也提供了上述模式的详细说明。您可以在此处粘贴第一个模式,以获得比我提供的更好的解释。