是否可以从字符串中获取.1到5之间的任何数字。这是我到目前为止所拥有的
def
我的问题是,这也将6.832号码作为.832。我有两个问题。有没有办法让整个数字失败,如果它大于.1而且第二个问题是我可以做类似[.1-5]的事情。有没有办法使用小数而不是整数来表示范围。
此外,我只需要第二个小数
答案 0 :(得分:2)
目前你的正则表达式确实存在一些问题。它与你的想法不符。
这是我在powershell中所做的:
$strings = @("test6.832test", "test3.832test")
$pattern = "(?<!\d|\d\.)((?!0\.0)[0-4](\.\d{1,3})?|5(\.0{1,3})?)(?!\d|\.\d)"
foreach ($string in $strings)
{
if($string -match $pattern){
Write-Host "yay" $Matches[1]
}
}
让我们详细了解正则表达式:
(?<!\d|\d\.)((?!0|0\.0)[0-4](\.\d{1,3})?|5(\.0{1,3})?)(?!\d|\.\d)
(?<!\d|\d\.)
这可以确保在我们匹配之前,在此匹配之前不会有数字或数字 - 小数点。
(?!0(?:[^.]|\.0)
表示它不低于0.1
[0-4]
这只会匹配数字0,1,2,3或4.我认为如果你想匹配.1
(领先的 0
)
[0-4](\.\d{1,3})?
这匹配小数,然后是1到3的小数。如果没有这样做,您可以匹配0.02
。问号使小数可选。
|5(\.0{1,3})?
这会处理上限5.这只匹配5或5.0或5.00或5.000
(?!\d|\.\d)
表示我们在匹配后不得匹配数字或小数位数。这可以防止"test0.01"
仅与第一个匹配。
在Regex101,如果你想看到它&#34;在行动&#34;或者得到更好的解释。
答案 1 :(得分:1)
解决方法是以某种方式提取String的数量,然后对值进行简单比较以过滤您想要保留的值。
如果您无法提取号码,请检查this page。 这是一个关于正则表达式的文档很好的教程。
答案 2 :(得分:0)
应该可以通过一系列替换来实现:
(?<![\d.])(?:[1-4](?:\.\d*)?|5(?:\.0*)?|\.[1-9]\d*)(?![\d.])
解释
(?<! [\d.] ) # Not a digit nor dot behind
(?: # Group, one of these
[1-4] # 1-4
(?: \. \d* )? # optional decimal fraction
| # or,
5 # 5
(?: \. 0* )? # optional dot 0
| # or
\. [1-9] \d* # decimal fraction >= .1
) # End group
(?! [\d.] ) # Not a digit nor dot ahead