0

我有以下格式的字符串:

ABC 318 XY2388

或者

ABC 318 XY02388

我希望他们成为“ABC 318/XY 2388”。因此,如果在第二批字母之后有任何前导零,则将其删除。

使用以下代码,我设法将输出作为

ABC 318/XY 2388

ABC 318/XY 02388 (错误!)

$input = "ABC 318 XY2388";
$output = preg_replace("/([A-Z]*) (\d*) ([A-Z]*)(\d*)/","$1 $2/$3 $4", $input);
echo $output;

谁能建议一种我可以从那里修剪 0(零)的方法?

所以如果我通过以下:

ABC 318 XY2388

或者

ABC 318 XY02388

最终输出应为 ABC 318/XY 2388

4

2 回答 2

2

*意思是“重复 0 次或多次”,所以你让每一个匹配都是可选的。您的正则表达式甚至会匹配字符串[SPACE][SPACE]A[SPACE][SPACE]A

正则表达式/([A-Z]+) ([0-9]+) ([A-Z]+)0?([0-9]+)/会更好。

这是一个演示和尸检:

  • ([A-Z]+)-匹配 AZ 之间的字母的捕获组重复 1 次或多次(这就是+意思)
  • [SPACE]-文字空格字符
  • ([0-9]+)-匹配 0 到 9 之间的数字的捕获组重复 1 次或更多次
  • [SPACE]-文字空格字符
  • ([A-Z]+)-与第一个相同。与 AZ 匹配的捕获组重复 1 次或多次。
  • 0?-重复 0 或 1 次的文字0字符(因此它是可选的)。
  • ([0-9]+)-匹配 0 到 9 之间的数字的捕获组重复 1 次或更多次

PHP 演示

PHP代码:

<?php
    $input = "ABC 318 XY2388";
    $output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)0?([0-9]+)/", "$1 $2/$3 $4", $input);
    var_dump($output); //string(15) "ABC 318/XY 2388"

    $input = "ABC 318 XY02388";
    $output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)0?([0-9]+)/", "$1 $2/$3 $4", $input);
    var_dump($output); //Same as above, as 0 is optional: string(15) "ABC 318/XY 2388"
?>
于 2013-07-10T07:52:21.920 回答
0

只是添加一个简单的建议:如果您需要修剪一个或多个中间 0,也许您可​​以这样做:

$input = "ABC 318 XY0002388";
$output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)(0*)([0-9]+)/", "$1 $2/$3 $5", $input);
var_dump($output); //should be "ABC 318/XY 2388"

请注意,我将“中间 0”保存在 4 美元上,但 4 美元不是输出的一部分。

我没有测试过它,但它应该可以工作,也许如果你没有用括号括起来“(0 *)”,它可以与“$1 $2/$3 $4”一起使用而不保存0。

我希望这有帮助。

于 2013-07-11T05:07:46.603 回答