正则表达式查找括号未关闭的字符串

Regex to find string where parenthesis are not closed

我需要一个正则表达式来查找括号未闭合的字符串

示例:

02 Back for Good (Radio Mix.mp3

查找“(电台混音”

但是如果

02 Back for Good (Radio Mix).mp3

一定找不到

希望对您有所帮助

preg_match('/\(.+\)$/','02 Back for Good (Radio Mix.mp3');
  • \( 匹配文字 (.
  • .+ 匹配一个或多个字符。
  • \)$ 匹配字符串末尾的文字 )

因此,如果整个表达式是字符串中的最后一个字符,则整个表达式将从第一个左括号匹配到最后一个右括号。否则匹配不上。

以下正则表达式捕获所需的输出:

(\([\w\s]+).mp3

一个工作示例可以是 found on Regex101

它搜索左括号 -\(-,捕获 words/digits(\w) 和空格 ( \s) 并附加文件扩展名“mp3” - 这样就缺少右括号。

如果你想捕获直到文件扩展名,你可以这样做:

\([^\)]*(?=\.\w+$)

https://regex101.com/r/cB1jG2/1

它会寻找一个左括号,然后是 除了 一个右括号,然后是一个 正向先行 以在以下位置找到文件扩展名字符串的末尾。

如果你知道可能的文件扩展名,你可以更直白:

\([^\)]*(?=\.(?:wav|mp3)$)

如果你可以嵌套括号,这可以匹配某些情况,但不是所有情况,并且可能可以简化为更清晰的内容:

\((?:\([^\(\)]*?\)|[^\)])*(?=\.\w+$)

https://regex101.com/r/aQ1eO3/1

我认为最好的方法是尝试使用 2 个正则表达式,并计算括号组的数量与 () 相同,所以在这种情况下,您在所有情况下都是安全的:

const value = <titleToCheck>;
const allParenthesisAreCorrect =
 (value.match(/\(.*?\)/g) || []).length !==
    (value.match(/\(/g) || []).length ||
 (value.match(/\(.*?\)/g) || []).length !== 
    (value.match(/\)/g) || []).length;