使用正则表达式提取字母数字字符串
问题描述:
看起来这应该很简单,但我一直无法在网上找到任何帮助。我将看到包含字母和数字的说明。但是,描述中有一个实例在字符串中包含字母和数字,而不仅仅是其中一个。例如使用正则表达式提取字母数字字符串
(FAXAGT JVM心跳的prod_faxagt_08(ft2ua937)端口39630(WAS9)) - :SiteScope的:FAXAGT JVM心跳的prod_faxagt_08(ft2ua937)端口39630(WAS9)错误。状态无法连接到服务器。完整路径 是FaxAgent
我想一个正则表达式,这将使我:
ft2ua937
只有一次,因为我知道这两次显示了在说明书中。
用最简单的术语来说,给定一个类似于上面的表达式,我想要一个输出,它带有两个字母&数字和没有特殊字符。应该忽略只有字母或数字的描述的任何部分。
答
我一直想要使用regexp_extract函数在Tableau中使用此表达式。为了我的目的,我相信我找到了一个可行的表达方式。
它可能有点难看但 REGEXP_EXTRACT([描述], '(\ W [AZ] {1,6} \ d {1,8} \ W {1,8} \ d \ w)的' ) 似乎正在工作,我需要它。
答
匹配任何带字母和数字的单词是解决这个问题的不好方法。 它看起来像你需要grep通过一些日志。也许Splunk将是一个不错的选择,如果这是你必须经常处理的事情。
在此期间,我建议你找出你的日志的情况下,直接找到你要找的内容:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class *45827050 {
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
*给出类似上述表达式* - 类似如何?哪些部分是固定的,哪些部分是可变的? – shmosel
到目前为止您尝试过什么?你可以用它来测试你的正则表达式https://regex101.com/ –
它是否只包含十六进制字符(所以不允许123xyz56)?长度总是8?为什么它必须包含*两个*字母*和*数字,因为“12345678”和“abcdefa”都是有效的十六进制数字?十六进制数字总是在括号内? – Bohemian