我正在尝试处理一堆文件,然后我需要改变以删除文件名中的无关信息; 值得注意的是,我正在尝试删除括号内的文本.例如:
filename = "Example_file_(extra_descriptor).ext"
我希望正则表达一大堆文件,其中括号表达式可能在中间或末尾,并且可变长度.
正则表达式是什么样的?Perl或Python语法将是首选.
s/\([^)]*\)//
所以在Python中,你会这样做:
re.sub(r'\([^)]*\)', '', filename)
在paretheses匹配子串的图案不具有其他(
和)
字符之间(如(xyz 123)
在Text (abc(xyz 123)
)是
\([^()]*\)
细节:
\(
- 开口圆括号(请注意,在POSIX BRE中,(
应使用,请参见sed
下面的示例)
[^()]*
- 除了否定字符类/POSIX括号表达式中定义的字符之外的零或更多(由于*
Kleene星形量词)字符,即除了和之外的任何字符(
)
\)
- 关闭圆括号(不允许在POSIX BRE中转义)
删除代码段:
JavaScript:string.replace(/\([^()]*\)/g, '')
PHP:preg_replace('~\([^()]*\)~', '', $string)
Perl:$s =~ s/\([^()]*\)//g
Python:re.sub(r'\([^()]*\)', '', s)
C#:Regex.Replace(str, @"\([^()]*\)", string.Empty)
VB.NET:Regex.Replace(str, "\([^()]*\)", "")
Java:s.replaceAll("\\([^()]*\\)", "")
Ruby:s.gsub(/\([^()]*\)/, '')
R:gsub("\\([^()]*\\)", "", x)
Lua:string.gsub(s, "%([^()]*%)", "")
Bash/sed:sed 's/([^()]*)//g'
Tcl:regsub -all {\([^()]*\)} $s "" result
C++std::regex
:std::regex_replace(s, std::regex(R"(\([^()]*\))"), "")
Objective-C:NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^()]*\\)" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];
我会用:
\([^)]*\)
如果你不绝对需要使用正则表达式,使用考虑使用Perl的文本::平衡删除括号.
use Text::Balanced qw(extract_bracketed); my ($extracted, $remainder, $prefix) = extract_bracketed( $filename, '()', '[^(]*' ); { no warnings 'uninitialized'; $filename = (defined $prefix or defined $remainder) ? $prefix . $remainder : $extracted; }
你可能会想,"为什么当一个正则表达式在一行中完成所有这一切?"
$filename =~ s/\([^}]*\)//;
Text :: Balanced处理嵌套括号.因此$filename = 'foo_(bar(baz)buz)).foo'
将被正确提取.这里提供的基于正则表达式的解决方案将在此字符串上失败.一个人将停在第一个关闭的paren,而另一个将全部吃掉它们.
$ filename = ~s /([^}]*)//; #wurn'foo_buz)).foo'
$ filename = ~s /(.*)//; #wurn'foo_.foo'
#text balanced example返回'foo _).foo'
如果任何一个正则表达式行为都可以接受,请使用正则表达式 - 但要记录限制和假设.