匹配字符串与正则表达式

时间:2013-08-26 09:26:57

标签: regex perl tcl

我有一个像

这样的字符串
-------- AGG x y PORT-16385-INFO    ----------------------------+

我想提取“AGG x y PORT-16385-INFO”。然而这种模式并不相同。它之间可以有任意数量的空格。

帮我用regexp来获取字符串。

我正在使用此正则表达式

regexp {\s+(.*)\-\-*} $a - am

输出

AGG PORT-16385-INFO    ---------------------------

这不是我想要的。帮助我使用正则表达式。

3 个答案:

答案 0 :(得分:4)

好吧,我假设您的分隔符长度至少为-两个,并且通过内容中的空格分隔。然后像一个简单的正则表达式

--\s+(.*?)\s+--

已经有效了。 *?量词进行非贪婪匹配,尽早终止。

如果此正则表达式有效取决于允许的值和输入的确切格式,您尚未充分解释。

我也很惊讶你把它标记为Perl - 我很确定你的代码是无效的Perl代码。


如果您不想使用.字符类,那么我们可以重写它以匹配所有非连字符或单个连字符后跟非连字符:

--\s+((?:[^-]+|-[^-])*)\s+--

Regular expression visualization

您可能也想要禁止连字符上的换行符。

答案 1 :(得分:3)

使用.*?可以起作用,就像amon所说的那样,但是,我有时会发现非贪婪量词在某种程度上是不可预测的。你可以使用锚来使贪婪量词做同样的事情:

^-+ (.*) -+\+$

这里我们要求字符串以指定的破折号序列(以及末尾的加号)开始和结束,因此贪婪的匹配不允许匹配太多。

答案 2 :(得分:1)

在tcl中,您可以使用字符串修剪轻松处理它。

set a "-------- AGG x y PORT-16385-INFO    ----------------------------+"
set b [string trim $a +-]; # to remove all + and -
set b [string trim $b]; # to remove all the white spaces
puts $b