在java中使用正则表达式从基于下划线的字符串中获取子字符串

在java中使用正则表达式从基于下划线的字符串中获取子字符串,java,regex,Java,Regex,我正在开发一个中间件工具,其中有一个预定义的选项,可以将java正则表达式与subStringRegEx(regex,string)一起使用 我的要求是从给定的文件名(例如:ABC\u XYZ\u 123\u adbc1234-ed98\u 1234.dat)中获取下划线(u)之间所需的子字符串 我已经尝试了以下3种方法,当通过选择java使用在线工具进行测试时,这些方法都可以正常工作。虽然在我的工具中没有按预期工作,但我得到的是“ABC_XYZ_123_adbc1234-ed98”而不是“ad

我正在开发一个中间件工具,其中有一个预定义的选项,可以将java正则表达式与subStringRegEx(regex,string)一起使用

我的要求是从给定的文件名(例如:
ABC\u XYZ\u 123\u adbc1234-ed98\u 1234.dat
)中获取下划线(u)之间所需的子字符串

我已经尝试了以下3种方法,当通过选择java使用在线工具进行测试时,这些方法都可以正常工作。虽然在我的工具中没有按预期工作,但我得到的是“ABC_XYZ_123_adbc1234-ed98”而不是“adbc1234-ed98”值

  • (?:[^.]+)\u(?:[^.]+)\ u(?:[^.]+)\ u([^.]+)
  • *?。。。。。。。([^.]+)
  • ^[^\uU]*.[^\ uU]*.[^\ uU]*.[^\ uU]*.[^\ uU]*.
  • 请求您的建议以实现解决方案

    谢谢, 库马尔

    您可以使用

    ^(?:[^_]+_){3}([^_]+).*
    
    并替换为
    $1
    。看

    详情:

    • ^
      -字符串的开头
    • (?:[^]+{3}
      -除
      以外的任何一个或多个字符出现三次,然后出现一个
      字符
    • ([^]+)
      -第1组(在替换模式中以
      $1
      引用):除
      \ucode>之外的一个或多个字符
    • *
      -字符串的其余部分
    另一个想法是:

    ^..*.[u0-9]+\..[^.]*$
    
    请参阅,您仍然需要替换为
    $1

    详情:

    • ^
      -字符串的开头
    • *
      -任何文本(不包括尽可能多的换行符)
    • 字符
    • ([^]+)
      -一个或多个字符,而不是
    • 字符
    • [0-9]+
      -一个或多个数字
    • \.
      -a
      字符(注意:
      \
      可能需要加倍)
    • [^.\u]*
      -除
      之外的任何零个或多个字符
    • $
      -字符串结束

    对于所显示的示例,请尝试以下正则表达式。值出现在捕获组1中,因此在执行替换时务必替换为$1

    ^(?:.*?_){3}([^_]*)_.*\.dat$
    

    或者,如果文件的格式可能是任何格式(除了
    .dat
    ),请尝试以下操作

    ^(?:.*?_){3}([^_]*)_.*
    

    解释:为上述正则表达式添加详细解释

    ^(?:.*?_){3}  ##Matching from starting of value, using non greedy match till _ 3 times in a non capturing group.
    ([^_]*)       ##Creating 1st capturing group which has values till 1st Occurrence of _ in it.
    _.*\.dat$     ##Matching from _ to till dat at the end of value.
    

    您可以简单地使用字符串方法来实现这一点:

    const str=“ABC_XYZ_123_adbc1234-ed98_1234.dat”
    const charSet=str.substr(0,str.length-4).split(“”).join(“”)
    
    console.log(charSet)
    我不确定
    子字符串regex(regex,string)
    的规范,但是如果它在
    字符串中返回与
    regex
    匹配的子字符串(
    $0
    ),那么它应该是

    String regex = "[^_]+(?=_[^_]*$)";
    

    为了完整起见,所有3种模式都可以工作,但您必须从组1中获得值

    范例

    String patterns[] = { 
        "(?:[^_]+)_(?:[^_]+)_(?:[^_]+)_([^_]+)", 
        ".*?_.*?_.*?_([^_]+)",
        "^[^_]*_[^_]*_[^_]*_([^_]*)_"
    };
    
    String s = "ABC_XYZ_123_adbc1234-ed98_1234.dat";
    
    for (String p : patterns) {
        
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(s);
        
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
    
    输出

    adbc1234-ed98
    adbc1234-ed98
    adbc1234-ed98
    

    请参阅a。

    为什么要使用正则表达式进行此操作?只需使用split(“_”)所有3种模式都有效,您的值在捕获组1中。使用并从捕获组中获取值难道不起作用吗?嗨,库马尔,您有时间测试了吗?第一个是通用的,第二个是更具体的,你可以试着两者都看哪一个最适合你。你忽略了这样一个事实:“我们有一个预定义的选项,可以将java正则表达式与
    subStringRegEx(regex,string)
    ”这篇文章有
    javascript
    标记,现在我看到它只与java相关:D