Как использовать регулярное выражение для поиска всех чисел, начинающихся с "$" - PullRequest
0 голосов
/ 18 июня 2020

Я имею дело со строками, которые содержат значения в долларах, не разделенные запятыми. Например:

«ЛОТ 2 - 650000 долларов»

Мне нужно найти «650000 долларов» и заменить его на «650 000 долларов».

Проблема в том, Когда дело касается регулярных выражений, я новичок. Я нашел сообщение, в котором предлагалось это для поиска чисел:

preg_match_all('!\d+!', $string, $matches);

Это успешно находит как «2», так и «650000» в моей строке. Однако я хочу убедиться, что получаю только числа, начинающиеся с символа «$», поэтому я хочу получить только «650000 долларов США».

Может ли кто-нибудь помочь мне адаптировать регулярное выражение, чтобы получать только числа, начинающиеся с «$»?

Ответы [ 4 ]

1 голос
/ 18 июня 2020

Вы можете заменить совпадения следующего регулярного выражения запятой, чтобы подтвердить наличие знака доллара и вставить запятые в правильные места.

/(?:\$|\G)\d+?\K(?=(?:\d{3})+$)/

Запустите двигатель!

Механизм PCRE выполняет следующие операции.

(?:         : begin non-capture group
  \$        : match '$'
  |         : or
  \G        : assert position at the end of the previous match
)           : end non-capture group
\d+?        : match 1+ digits
\K          : reset starting point of match and no longer include
              previously-consumed characters in reported match
(?=         : begin positive lookahead
  (?:\d{3}) : match 3 digits in a non-capture group
  +         : execute non-capture group 1+ times
  $         : match end of string
)           : end positive lookahead
1 голос
/ 18 июня 2020

Ответ Кевина лучше. Я прошел долгий путь:

<?php

$dollarString = 'I would like $100000000000 more than I would like $10000000 but that is still better than $1000 and $99 problems.';

echo '<p>dollarString: ';
var_dump($dollarString);
echo '</p>';

function addCommas ($matches){
    $output = [];
    $number = $matches[1];
    $j = 1;
    for($i=strlen($number)-1; $i>=0; $i--){
        array_push($output, $number[$i]);
        if($j%3 == 0 && $i != 0 && $i != strlen($number)-1){array_push($output, ',');}
        $j++;
    }
    array_push($output, '$');
    $output = array_reverse($output);
    return implode($output);
}

$newString = preg_replace_callback('#\$(\d+)#', 'addCommas', $dollarString);

echo '<p>newString: ';
var_dump($newString);
echo '</p>';

?>
1 голос
/ 18 июня 2020

Просто добавьте знак доллара в свой узор и используйте preg_replace_callback, затем объедините number_format. Примерно так:

$string = preg_replace_callback('~\$(\d+)~', function($matches) {
    return !empty($matches[1]) ? '$' . number_format($matches[1]) : null;
}, $string);
0 голосов
/ 18 июня 2020

Попробуйте следующее:

preg_match_all('!\$\d+!', $string, $matches);

Этот веб-сайт действительно помог мне понять, как этого добиться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...