簡體   English   中英

正則表達式將2個反斜杠替換為3

[英]Regex replace exactly 2 backslashes by 3

我有一個字符串,其中2個反斜杠必須變為3個反斜杠。 有了所有的反斜杠轉義,我做不到,而且沒有任何效果。

例如:

  • aaaaa\\\\aaaaa必須成為aaaaa\\\\\\aaaaa
  • aaaaa\\\\\\aaaaa aaaaa\\\\\\aaaaa (不能檢測到連續2個反斜杠)

我對此進行了管理,可在regex101.com中使用:

(\\\\)([^\\])

因此在php中,它將是:

preg_replace('/(\\\\)([^\\])/', '\\\$2', $bob);

但是php給了我這個錯誤信息:

preg_replace(): Compilation failed: missing terminating ] for character class at offset 10

因此,我不知道這是否是PHP的錯誤,但是我需要另一種方法來執行此操作,因此無法在Google上找到解決方案。

您可能想在這里利用preg_quote優勢:

$in1 = <<<'EOD'
aaaaa\\aaaaa
EOD;
$in2 = <<<'EOD'
aaaaa\\\aaaaa
EOD;

echo "input 1: $in1";
echo "input 2: $in2";

$q = preg_quote('\\','/');

echo "output 1: " . preg_replace("/(?<!$q)$q$q(?!$q)/", "$q$q$q", $in1);
echo "output 2: " . preg_replace("/(?<!$q)$q$q(?!$q)/", "$q$q$q", $in2);

我使用了nowdoc (自PHP 5.3.0起可用)來定義輸入字符串,以便可以按其外觀完全看到它。 在nowdoc中不進行任何解析。

$q現在是一個轉義的反斜杠,可在之前要使用文字\\任何位置用於preg_replace

正則表達式使用負的lookbehind (?<!$q)和負的lookahead (?!$q)來確保中間的兩個斜杠不在斜杠的前面或后面。

輸出:

input 1: aaaaa\\aaaaa
input 2: aaaaa\\\aaaaa
output 1: aaaaa\\\aaaaa
output 2: aaaaa\\\aaaaa

preg_quote通常用於長度超過一個字符的變量,因此在這里可能被視為過大。 您可以定義$q = '\\\\\\\\';而不是使用它$q = '\\\\\\\\'; (兩個字符串轉義的反斜杠),將獲得相同的結果。

試試這個正則表達式:

(?<!\x5C)\x5C{2}(?!\x5C)

反斜杠在這里可能是一個真正的噩夢。 最好在正則表達式中使用反斜杠的ASCII代碼。

樣例代碼:

define('THREE_SLASHES', preg_quote('\\\\\\'));
define('RE_TWO_SLASHES_ONLY', '~(?<!\x5c)\x5c{2}(?!\x5c)~');

$test='aaaaa\\\\aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY, THREE_SLASHES, $test) . '<br>';

$test='aaaaa\\\\\\aaaaa';
echo preg_replace(RE_TWO_SLASHES_ONLY, THREE_SLASHES, $test) . '<br>';

產量

aaaaa\\\aaaaa
aaaaa\\\aaaaa

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM