Regular expression

快速查表

.
What Does the Fox Say? 12 狐狸怎叫 34

.? = .{0,1}
What Does the Fox Say? 12 狐狸怎叫 34

.* = .{0,}
What Does the Fox Say? 12 狐狸怎叫 34

.+ = .{1,}
What Does the Fox Say? 12 狐狸怎叫 34

\s+
What Does the Fox Say? 12 狐狸怎叫 34 任意多個文字(不包含空白或換行符號)
[^\s]+ = [^\s]{1,} = [\S]+ = [^ ]+
What Does the Fox Say? 12 狐狸怎叫 34

[\x00-\x80]+
What Does the Fox Say? 12 狐狸怎叫 34 非 ASCII，即中文出現任意次
[^\x00-\x80]+
What Does the Fox Say? 12 狐狸怎叫 34

[\w]+ = [a-zA-Z0-9_]+
What Does the Fox Say? 12 狐狸怎叫 34 任意次的不是英文、數字和底線符號( _ )的文字
\W+ = [^a-zA-Z0-9_]+
demo

[\d]+ = [0-9]+
What Does the Fox Say? 12 狐狸怎叫 34 不包含數字的任意次文字(包含空白
[^\d]+ = [^0-9]+ = \D+
What Does the Fox Say? 12 狐狸怎叫 34

^狐狸.*\$[4]

^(?!狐狸).*\$[5]

^.*怎叫\$

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

.*(?<!怎叫)\$[6]

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

^.*狐狸.*\$

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

^((?!狐狸).)*\$

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

(?=.*狐狸)(?=.*叫).*

What Does the Fox Say? 12 狐狸怎叫 34
What Does the Fox Say? 12 不叫狐狸 34
What Does the shiba inu say? 柴犬怎叫

.*(狐狸|叫).*

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

What Does the shiba inu say? 柴犬怎了

^((?!狐狸|柴犬).)*\$
What Does the Fox Say? 12 狐狸怎叫 34

What Does the shiba inu say? 柴犬怎叫

What Does the Husky say? 哈士奇怎叫

^((?!狐狸).)*(柴犬).*\$ = ^(柴犬).*((?!狐狸).)*\$ = (柴犬).*((?!狐狸).)*

What Does the Fox Say? 12 狐狸怎叫 34
What Does the shiba inu say? 柴犬怎叫

examples

cases

將Email清單，轉成Email軟體可以使用的寄信名單 (取代換行符號為逗號)

```原
[email protected]
[email protected]
[email protected]

[email protected], [email protected], [email protected]
```

方案1: Sublime Text, EmEditor

2. click "Use Regular Expression"
1. Find: \n (換行符號Win 作業系統的換行符號是 \r\nMac 作業系統的換行符號是 \n，取兩者共有的符號。如果使用 Linux 作業系統的換行符號是 \r。 )
2. Replace with: ,
3. click "Replace all"

1. 選單: 尋找 -> 取代
2. 搜尋模式: 勾選「增強模式」 (不是勾選「用類型表式」)
1. 尋找目標: \n (換行符號)
2. 取代成: ,
3. 勾選全部取代

方案3: Microsoft Word

1. 選單: 編輯 -> 取代
2. 勾選增強模式
1. 尋找目標: ^p (段落標記)
2. 取代為: ,
3. 勾選全部取代

方案4: Sed command for linux

sed 's/要被取代的字串/新的字串/g' old.filename > new.filename[9]

(1)要被取代的字串: :a;N;\$!ba;s/\n (2)新的字串: ;

sed ':a;N;\$!ba;s/\n/; /g' old.filename > new.filename [10]

將每行的文字，移除換行，並且都加上逗號分隔

```// before
Elmo
Emie
Granny Bird

// after
Elmo, Emie, Granny Bird
```

• Find what: \n
• Replace with: , 此例是將每行的文字，都加上逗號+空格分隔 (如果要用別的符號分隔，例如頓號分隔，則是 Replace with: )

將逗號分隔的文字，還原成逐行顯示，並且移除分隔符號 (,)

```// before
Elmo, Emie, Granny Bird

// after
Elmo
Emie
Granny Bird
```

• Find what: ([^,]+),
• Replace with: \1\n

1. 選單: 尋找 -> 取代
2. 搜尋模式: 勾選「用類型表式」
1. 尋找目標: \d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?

note: not support {n} syntax

移除記事本純文字檔的黑色方塊(UNIX系統的換行符號 LF )

1. 選單: 尋找 -> 取代
2. 搜尋模式: 勾選「增強模式」
1. 尋找目標: \n\n (註: 2個LF )
2. 取代成: \r\n (註: CR與LF )

將每項元素，加上引號框起來

將陣列的每項元素，都加上引號框起來

```Elmo, Emie, Granny Bird, Herry Monster, 喀喀獸

'Elmo', 'Emie', 'Granny Bird', 'Herry Monster', '喀喀獸'
```

```\$users = array('Elmo', 'Emie', 'Granny Bird', 'Herry Monster', '喀喀獸');
//「單引號」相隔每個元素
\$result = implode(",", preg_replace('/^(.*?)\$/', "'\$1'", \$users));

//「雙引號」相隔每個元素
\$result = implode(",", preg_replace('/^(.*?)\$/', "\"\$1\"", \$users));
echo \$result;
```

Thanks, Joshua! More on PHP - Wrap Implode Array Elements in Quotes » Me Like Dev

• Find: ([^\s|,]+)
• 分隔符號
• 「單引號」相隔每個元素 Replace with: '\1'
• 「雙引號」相隔每個元素 Replace with: "\1"

• Find: ([^\s|,]+)
• 分隔符號
• 「單引號」相隔每個元素 Replace with: '\$1'
• 「雙引號」相隔每個元素 Replace with: "\$1"

將每行的文字，都加上引號框起來，並且移除換行

```// before
Elmo
Emie
Granny Bird

// after
'Elmo', 'Emie', 'Granny Bird'
```

• Find what: (\S+)(\s?)+\$\n
• Replace with: '\1',
(如果要使用雙引號框起來，則是 Replace with: "\1", )

• Find what: (.*)\$\n(\S+)\$\n(\S+)\n
• Replace with: '\1',

將引號框起來的文字，還原成逐行顯示，並且移除分隔符號 (,)

```// before
'Elmo', 'Emie', 'Granny Bird'

// after
Elmo
Emie
Granny Bird
```

• Find what: '(([^,|^'])+)',?\s?
• Replace with: \1\n

尋找中文、非英文的文字

```[^\x00-\x80]+
```

```[^\u0000-\u0080]+
```

```SELECT `column_name`
FROM `table_name`
WHERE HEX(`column_name`) REGEXP '^(..)*(E[4-9])';
```

```// approach 1
if (preg_match('/^[\x{4e00}-\x{9fa5}]+\$/u', \$string)) {
echo "全部文字都是中文字" . PHP_EOL;
}else{
echo "部分文字不是中文字" . PHP_EOL;
}

// approach 2
if (preg_match('/^[\p{Han}]+\$/u', \$string)) {
echo "全部文字都是中文字" . PHP_EOL;
}else{
echo "部分文字不是中文字" . PHP_EOL;
}
```

• 錯誤訊息:
`preg_match(): Compilation failed: character value in \x{} or \o{} is too large at offset 8`

將每行文字的行頭加上逗號符號

1. 選單: 尋找 -> 取代
2. 搜尋模式: 勾選「用類型表示」
1. 尋找目標: (.*) 或者是 ^(.*)\$
2. 取代成: ,\1 或者是 ,\$1

知道前面跟後面的文字，但是中間文字忘記了

1. 選單: 尋找 -> 取代
2. 搜尋模式: 勾選「用類型表示」
1. 尋找目標: a(.*)le 就可以找到(1)apple (2)apps lesson ... 等a開頭、le結尾的文字，中間可夾雜空白。 中文字串搜尋，建議將文件的編碼改成 UTF-8 編碼

移除空白行

```# (原) 每行可能間隔一行空白或多行空白

# (後) 改成每行逐行緊接著

```

• 使用工具: 適用 Sublime Text 與 EmEditor 軟體，需勾選「使用規則運算式」。 以下語法不適用於 Notepad++ 軟體[15]
• 尋找: ^[\s\t]*\$\n --> 取代為: 空 (不需要輸入任何字)
• Notepad++ 軟體選單: 編輯 -> 行列 -> 移除空行(含空白字元 SPACE )[16]
• 詳細說明，請見 Regular replace blank lines

將特定符號相隔的文字，改成逐行顯示

```# (原) 頓號(、)符號相隔的文字

# (後) 改成逐行顯示

```
• Find: ([^、]+)([、]{1})
• Replace with: \1\n

• [^、] : 符合任意字，但不是頓號(、)的文字
• [^、]+ : 一次以上不是頓號(、)的文字
• ([^、]+) : 符合「一次以上不是頓號(、)的文字」規則的文字
• [、]: 出現頓號(、)任意次的文字
• [、]{1} : 出現頓號(、)一次的文字
• ([、]{1}) : 符合「出現頓號(、)一次的文字」規則的文字

將每行文字的結尾處，加入空一格 (半形空白)

2. click "Use Regular Expression"
1. Find: \n
2. Replace with: _\n(符號 \n 前面的 _ 自行替換成半形空白)
3. click "Replace all"

2. click "Use Regular Expression"
1. Find: \$
2. Replace with: _\$(符號 \$ 前面的 _ 自行替換成半形空白)
3. click "Replace all"

將每行文字內夾雜的空白，取代成 Tab 符號

```# \t 代表是 Tab 鍵，又稱定位鍵
# before
aaa bbb    ccc

# after
aaa\tbbb\tccc
```

2. click "Use Regular Expression"
1. Find: ([^\S\n]+)([^\S\r\n]+)_{1,} ( 自行替換 _ 成半形空白)
2. Replace with: \t
3. click "Replace all"

移除每行文字前後面可能多個的空白

移除每行文字最前面可能多個的空白

• 尋找: ^\s+ --> 取代為: 空白 (適用軟體: Sublime Text、EmEditor，需啟用 "Use Regular Expression" )
```# before
aaa
bbb
ccc

# after
aaa
bbb
ccc
```

移除每行文字最後面可能多個的空白

• 尋找: \s+\$ --> 取代為: 空白 (適用軟體: Sublime Text、EmEditor，需啟用 "Use Regular Expression" )

移除每行文字前面或後面可能多個的空白

• 尋找: (^\s+|\s+\$) --> 取代為: 空白 (適用軟體: Sublime Text、EmEditor，需啟用 "Use Regular Expression" )

尋找包含不是數字，是文字的行

```[^\d|\n]
```

Search unmatched string

find un-commented console.log:

original format: some lines contains un-commented Javascript debug information

```   console.log("un-commented debug information");

//console.log("commented debug information");
```

Search pattern: find not started with the / symbol before the string "console.log"

```   [^/](console\.log)
```

Regular expression batch tools

multiple regular expression operations on the same file

one regular expression operations on multiple files

syntax

• 換行符號: \r\n (適用: Notepad++選項: 增強模式 & 用類型表式)
• tab鍵的固定空白分隔: \t (適用: Notepad++選項: 增強模式)
• \S 非空白的文字: 不會含括半形空白與全行空白

Troubleshooting of regular expression

Tips

• Small data test: (1) Prepare the small file data to verify the syntax (2) Using the online tools
• Highlight or output the matched text e.g. --color[19] for grep command or output the matches by PHP preg_match() function.
• Simplify the syntax
• Because the compatibility issue, you may try to use the alternative syntax e.g. \d to [0-9]+.

Related articles

unicode

references