2017-08-22 169 views
0

看起来这应该很简单,但我一直无法在网上找到任何帮助。我将看到包含字母和数字的说明。但是,描述中有一个实例在字符串中包含字母和数字,而不仅仅是其中一个。例如使用正则表达式提取字母数字字符串

(FAXAGT JVM心跳的prod_faxagt_08(ft2ua937)端口39630(WAS9)) - :SiteScope的:FAXAGT JVM心跳的prod_faxagt_08(ft2ua937)端口39630(WAS9)错误。状态无法连接到服务器。完整路径 是FaxAgent

我想一个正则表达式,这将使我:

ft2ua937

只有一次,因为我知道这两次显示了在说明书中。

用最简单的术语来说,给定一个类似于上面的表达式,我想要一个输出,它带有两个字母&数字和没有特殊字符。应该忽略只有字母或数字的描述的任何部分。

+3

*给出类似上述表达式* - 类似如何?哪些部分是固定的,哪些部分是可变的? – shmosel

+0

到目前为止您尝试过什么?你可以用它来测试你的正则表达式https://regex101.com/ –

+0

它是否只包含十六进制字符(所以不允许123xyz56)?长度总是8?为什么它必须包含*两个*字母*和*数字,因为“12345678”和“abcdefa”都是有效的十六进制数字?十六进制数字总是在括号内? – Bohemian

回答

0

我一直想要使用regexp_extract函数在Tableau中使用此表达式。为了我的目的,我相信我找到了一个可行的表达方式。

它可能有点难看但 REGEXP_EXTRACT([描述], '(\ W [AZ] {1,6} \ d {1,8} \ W {1,8} \ d \ w)的' ) 似乎正在工作,我需要它。

0

匹配任何带字母和数字的单词是解决这个问题的不好方法。 它看起来像你需要grep通过一些日志。也许Splunk将是一个不错的选择,如果这是你必须经常处理的事情。

在此期间,我建议你找出你的日志的情况下,直接找到你要找的内容:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StackOverflow45827050 { 
    private static final String EXAMPLE = "(FAXAGT JVM Heartbeat on prod_faxagt_08 (ft2ua937) Port 39630 (WAS9)) - : " + 
             "Sitescope: FAXAGT JVM Heartbeat on prod_faxagt_08 (ft2ua937) Port 39630 (WAS9) error. " + 
             "Status is unable to connect to server. Full path is FaxAgent"; 
    private static final Pattern JVM_HEARTBEAT_PATTERN = Pattern.compile(
     "\\((?<messageCode>.*) JVM Heartbeat on (?<hostName>.*) \\((?<importantCode>.*)\\) Port (?<port>\\d*).*"); 

    public static void main(final String... args) { 
    final Matcher matcher = JVM_HEARTBEAT_PATTERN.matcher(EXAMPLE); 
    if (!matcher.matches()) { 
     throw new IllegalArgumentException(); 
    } 
    System.out.println(matcher.group("importantCode")); 
    } 

} 

产量:

ft2ua937