1

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

我有一个包含各种数字、空格和字符组合的 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

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

非常感谢您的帮助。

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

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*\"')";
4

2 回答 2

2

此正则表达式应与您的所有 ID 匹配(这是一个演示

/(\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
于 2013-01-19T07:09:06.053 回答
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

Very ugly und unelegant solution buth I belive it works.

于 2013-01-19T07:22:39.460 回答