1

かなり難しい一連の要件があります。

数字、スペース、文字のさまざまな組み合わせのIDを持っていますが、正規表現を使用して特定の文字を照合および置換したいと考えています。

要件は次のとおりです。

  1. IDにすべての数字が含まれ、文字が含まれていない場合は、2番目の数字の後にスペースを挿入する必要があります。たとえば、IDが12384499003833であると想定します。2桁目の後にスペースを挿入すると、新しい値は12384499003833になります。

  2. 12384499003833の同じID値を取り、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()を必要とするが、完全に正規表現と置換(デモ)を使用するこのアプローチを使用できます(これは少し難しいかもしれないことに注意してください)

$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

非常に醜くて不法な解決策ですが、私はそれがうまくいくと信じています。

于 2013-01-19T07:22:39.460 に答える