Removing everything except numbers inside braces and some characters

www*_*.in 3 php regex

Want to remove everything except # NewLine, complete bracket set and numbers inside braces.
Sample input:

# (1296) {20} [529] [1496] [411]
# (MONDAY ) (1296)
# (646) {20} (BEACH 7) [20 Mtrs] { 03 Foot }
# {19} [455] [721] (1296) (SUNDAY ) [2741] (MONDAY (WEDNESDAY {20}
# {19} (1296)
Run Code Online (Sandbox Code Playgroud)

Code which does not work:

$re = '/(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}@#]+/m';
$result = preg_replace($re, '', $input);
Run Code Online (Sandbox Code Playgroud)

Incorrect output:

#(1296){20}[529][1496][411]
#(1296) 
#(646){20}(BEACH 7)[20 Mtrs]{ 03 Foot }
#{19}[455][721](1296)[2741](({20}
#{19}(1296)
Run Code Online (Sandbox Code Playgroud)

Desired output:

#(1296) {20} [529] [1496] [411]
#(1296)
#(646) {20}
#{19} [455] [721] (1296) [2741] {20}
#{19} (1296)
Run Code Online (Sandbox Code Playgroud)

The*_*ird 5

您可以在括号之间匹配至少 1 位数字,然后跳过该匹配。

然后匹配除换行符或#替换为空字符串之外的任何字符。

(?:\[\h*\d[\h\d]*]|\(\h*\d[\h\d]*\)|{\h*\d[\h\d]*})\h*(*SKIP)(*F)|[^#\n]
Run Code Online (Sandbox Code Playgroud)

解释

  • (?:非捕获组
    • \[\h*\d[\h\d]*]匹配方括号之间至少 1 个数字,其中\h匹配水平空白字符(无换行符)
    • |或者
    • \(\h*\d[\h\d]*\)括号内为 1 位数字
    • |或者
    • {\h*\d[\h\d]*}大括号之间有 1 位数字
  • )\h*关闭非捕获组并匹配 1+ 个空格
  • (*SKIP)(*F)跳过并失败匹配(使其在输出中保持不变)
  • |或者
  • [^#\n]#匹配除或 换行符之外的任何字符

正则表达式演示