我有一套相当具有挑战性的要求。
我有一个ID,包含数字,空格和字符的各种组合,并希望使用正则表达式匹配和替换某些字符。
以下是要求:
如果ID包含所有数字且没有字符,那么我们需要在第二个数字后插入一个空格。例如,假设ID为12384499003833.在第二个数字后插入空格后,新值应为12 384499003833。
获取相同的ID值12384499003833,如果第3个字符是D或N,那么应该没有空格。该值应类似于:12 * N * 84499003833。
同样,使用相同的值作为示例,如果第10个和第11个字符是GG,则在GG之前插入2个空格。添加2个空格后,新值应类似于123844990 * GG * 833
和最终要求:如果第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*\"')";
答案 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
非常难看且不优雅的解决方案,但我相信它有效。