如何使用正则表达式格式化ID?

时间:2013-01-19 06:53:43

标签: php regex

我有一套相当具有挑战性的要求。

我有一个ID,包含数字,空格和字符的各种组合,并希望使用正则表达式匹配和替换某些字符。

以下是要求:

  1. 如果ID包含所有数字且没有字符,那么我们需要在第二个数字后插入一个空格。例如,假设ID为12384499003833.在第二个数字后插入空格后,新值应为12 384499003833。

  2. 获取相同的ID值12384499003833,如果第3个字符是D或N,那么应该没有空格。该值应类似于:12 * N * 84499003833。

  3. 同样,使用相同的值作为示例,如果第10个第11个字符是GG,则在GG之前插入2个空格。添加2个空格后,新值应类似于123844990 * GG * 833

  4. 和最终要求:如果第3个字符是D或N且第10个和第11个字符是GG,则第2个数字后面应该没有空格但GG后应该有2个空格。 示例输出应类似于:12 * D * 844990 * GG * 03833

  5. 我真的很抱歉,但我真的很难过。

    非常感谢您的协助。

    这是一个输入值及其格式化输出值的表格

    Input            | Output
    12384499003833   | 12 384499003833
    12N84499003833   | 12N84499003833
    12D84499003833   | 12D84499003833
    123844990GG833   | 12 3844990  GG833
    12N844990GG833   | 12N844990  GG833
    12D844990GG833   | 12D844990  GG833
    
    $tid = $_GET["tid"];
    
    // Connect to SQL Server database
    include("../connections/TDConnect.php");
    
    $tsql = "SELECT * FROM TC(dtops.dbo.tSearch, Name, '\"$tid*\"')";
    

2 个答案:

答案 0 :(得分:2)

此正则表达式应匹配您的所有ID(此处为demo

/(\d{2})([ND]?)(\d*)(GG[\d]*)?/

然后你可以通过组合这样的组来组合你的输出:

$pattern = "/(\d{2})([ND]?)(\d*)(GG[\d]*)?/";

function format($matches) {
  return $matches[1][0].(strlen($matches[2][0])>0?$matches[2][0]:" ").$matches[3][0].(strlen($matches[4][0])>0?"  ".$matches[4][0]:"");
}

//To Test this
preg_match_all($pattern, "12384499003833", $matches);
echo(format($matches)."<br/>");

preg_match_all($pattern, "12N84499003833", $matches);
echo(format($matches)."<br/>");

preg_match_all($pattern, "12D84499003833", $matches);
echo(format($matches)."<br/>");

preg_match_all($pattern, "123844990GG833", $matches);
echo(format($matches)."<br/>");

preg_match_all($pattern, "12N844990GG833", $matches);
echo(format($matches)."<br/>");

preg_match_all($pattern, "12D844990GG833", $matches);
echo(format($matches)."<br/>");

输出:

12 384499003833
12N84499003833
12D84499003833
12 3844990 GG833
12N844990 GG833
12D844990 GG833

或者你可以使用这种方法,它需要输出的LTrim()但使用完全正则表达式并替换(demo)(注意这可能有点难以理解)

$pattern = "/(\d{2})(\d+)(GG[\d]+)?|(\d{2})([ND])(\d+)(GG[\d]+)?/";
$replacement = "$1 $2$4$5$6  $7$3";

echo(ltrim(preg_replace($pattern, $replacement, "12384499003833"))."<br/>");
echo(ltrim(preg_replace($pattern, $replacement, "12N84499003833"))."<br/>");
echo(ltrim(preg_replace($pattern, $replacement, "12D84499003833"))."<br/>");
echo(ltrim(preg_replace($pattern, $replacement, "123844990GG833"))."<br/>");
echo(ltrim(preg_replace($pattern, $replacement, "12N844990GG833"))."<br/>");
echo(ltrim(preg_replace($pattern, $replacement, "12D844990GG833"))."<br/>");

这是输出:

12 384499003833
12N84499003833
12D84499003833
12 3844990 GG833
12N844990 GG833
12D844990 GG833

答案 1 :(得分:0)

(\d{3})(\d{11} if match then replace with  $1 $2
(\d{2})([ND])(\d{6})GG(\d{3}) if match then replace with  $1$2$3 GG$4
(\d{2})(\d{1})(\d{6})GG(\d{3}) if match then replace with  $1 $3 GG$4

非常难看且不优雅的解决方案,但我相信它有效。