2

我有一个字符串

-------- AGG x y PORT-16385-INFO    ----------------------------+

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

帮助我使用正则表达式来获取字符串。

我正在使用这个正则表达式

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

输出

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

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

4

3 回答 3

4

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

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

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

如果此正则表达式有效,则很大程度上取决于允许的值和输入的确切格式,而您尚未对此进行充分解释。

我也很惊讶您将其标记为 Perl — 我很确定您的代码不是有效的 Perl 代码。


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

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

正则表达式可视化

您可能还想禁止连字符旁边的换行符。

于 2013-08-26T09:36:40.080 回答
3

使用.*?can 工作,就像 amon 说的那样,但是,我有时发现非贪婪量词有些不可预测。您可以使用锚点使贪婪量词做同样的事情:

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

这里我们要求字符串以指定的破折号序列开始和结束(并在末尾加上一个加号),所以贪心匹配不允许匹配太多。

于 2013-08-26T09:49:53.443 回答
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
于 2013-08-26T11:45:01.467 回答