正则表达式 - 以字符串开头和结尾

问题描述 投票:-2回答:3

我想编写一个正则表达式来匹配以“AMDF”或“SB700”开头并且不以“.tmp”结尾的文件。这将在Java中使用。

java regex string
3个回答
0
投票

See regex in use here

^(?:AMDF|SB700).*\.(?!tmp$)[^.]+$

Usage

See code in use here

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        final String regex = "^(?:AMDF|SB700).*\\.(?!tmp$)[^.]+$";
        final String[] files = {
            "AMDF123978sudjfadfs.ext",
            "SB700afddasjfkadsfs.ext",
            "AMDE41312312089fsas.ext",
            "SB701fs98dfjasdjfsd.ext",
            "AMDF123120381203113.tmp"
        };

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);

        for (String file:files) {
            final Matcher matcher = pattern.matcher(file);
            if(matcher.matches()) {
                System.out.println(matcher.group(0));
            }
        }
    }
}

结果

Input

AMDF123978sudjfadfs.ext
SB700afddasjfkadsfs.ext

AMDE41312312089fsas.ext
SB701fs98dfjasdjfsd.ext
AMDF123120381203113.tmp

Output

以下仅显示匹配项。

AMDF123978sudjfadfs.ext
SB700afddasjfkadsfs.ext

说明

  • ^在线的开头断言位置
  • (?:AMDF|SB700)字面上匹配AMDFSB700
  • .*任意次数匹配任何字符
  • \.匹配字面点.字符
  • (?!tmp$)负向前瞻确保以下内容与字面上的tmp不匹配(之后断言该行的结尾以便不匹配.tmpx,其中x可以是任何东西)
  • [^.]+匹配除.之外的任何角色一次或多次
  • $在线的末尾断言位置

0
投票

这是另一个有效的例子:

^(SB700 | AMDF)*(\ tmp目录?!){4} $。


0
投票

一种方法可能是使用负前瞻来尝试使用正则表达式断言文件名不会在.tmp上结束并使用锚点^来确保文件名以AMDFSB700开头,如:

^(?!.*\.tmp$)(?:AMDF|SB700)\w*\.\w+$

说明

  • 字符串^的开头
  • 负向前瞻(?!
  • 断言字符串以.tmp .*\.tmp$结尾
  • 与AMDF或SB700 (?:AMDF|SB700)匹配的非捕获组
  • 匹配单词字符零次或多次\w*
  • 匹配点\.
  • 匹配单词字符一次或多次\w+
  • 字符串$的结尾

在Java中它看起来像:

^(?!.*\\.tmp$)(?:AMDF|SB700)\\w*\\.\\w+$

Demo

© www.soinside.com 2019 - 2024. All rights reserved.