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


How can I use Regular Expression to format an ID?

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

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

以下是要求:

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

  2. 取12384499003833的相同ID值,如果第三个字符是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*'"')";

这个Regex应该匹配你的所有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((,但完全使用regex和replace(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
('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

非常丑陋且不合法的解决方案,但我相信它有效