我有点问题,或者也许只是tunnelvision:我想从字符串的末尾得到第一个数字,该字符串不是 uint8
。给定的字符串仅包含数字是100%安全的。
heatmap = np.uint8(np.interp(heatmap, (heatmap.min(), heatmap.max()), (0, 255)))
输出为:
0
是正确的,第一个零在位置2 [索引1]。
$number = 902200100;
$firstZero = strpos($number, "0");
preg_match('/[1-9]/', $n, $matches, PREG_UNMATCHED_AS_NULL, -1);
var_dump($matches);
echo "first zero: " . $firstZero;
echo "\r\n";
echo "last non-zero: " . $matches[0][0];
是错误的,它应该是2(从右边开始的位置3,索引2)。
我也尝试将标志更改为first zero: 1
,但这并不能解决问题。偏移量last non-zero: 0
在这里不起作用吗?那么正确的方法是什么?
我也将模式从[0-9]更改为[1-9],感觉有1-9根本没有输出。
沙箱:http://sandbox.onlinephpfunctions.com/code/2caa5051d73a91e6b19dd30187354b597638c68c
答案 0 :(得分:3)
使用正则表达式,您可以按照以下方式使用PREG_OFFSET_CAPTURE
:
function maximizeNumberRoundness($n) {
$firstZero = strpos($n, "0");
preg_match('/([^0])0*$/', $n, $match, PREG_OFFSET_CAPTURE);
echo "first zero: " . $firstZero;
echo "\r\n";
$last_nonzero_index = strlen($n) - $match[1][1] - 1;
echo "last non-zero: " . $last_nonzero_index;
}
maximizeNumberRoundness(902200100);
输出:
first zero: 1
last non-zero: 2
据我所知,这可以正常工作,即您希望从字符串的 right 中获取最后一个非零的索引。
答案 1 :(得分:1)
这是正则表达式
preg_match('/([^0])0*$/', $string, $match);
echo $match[1];
在这种情况下,902200100
的输出是
1
其他选择
$string[strpos($string,'0')];
另外,1不正确,因为我需要位置而不是值。
strrpos
-请注意,r
类似于strpos
,但它找到的是最后一次出现的内容,而不是第一次出现的
更新
尝试一下这样的事情,现在我想我知道你想要什么。
var_export(preg_split('/(0)/', '902200100',-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
输出
array (
0 => '9',
1 => '0',
2 => '22',
3 => '0',
4 => '0',
5 => '1',
6 => '0',
7 => '0',
)
然后我将其与array_itersect($split, [0])
之类的东西组合在一起。
array (
1 => '0',
3 => '0',
4 => '0',
6 => '0',
7 => '0',
)
在这种情况下(请注意按键),其余的都很琐碎。如果您希望该位置使用单个数字,则只需使用str_split
然后相交
答案 2 :(得分:0)
只有一种可能的解决方案:
$rev = strrev((string) $number);
$pos = function() use ($rev) {
for($i=0;$i<count($rev);$i++) {
if(rev[$i] != "0") return $i;
}
};
echo "last non-zero": $pos();
答案 3 :(得分:0)
试试吧。如果您打算多次调用此函数,则应避免使用正则表达式。
<?php
function getLastCharacterThatIsntZero($number) {
$characters = array_reverse(str_split((string)$number));
foreach($characters AS $character) {
if($character != "0") {
return (int)$character;
}
}
return false;
}
var_dump(getLastCharacterThatIsntZero(12345)); // returns 5
var_dump(getLastCharacterThatIsntZero(123450)); // returns 5
var_dump(getLastCharacterThatIsntZero(0)); // returns false