正则表达式是什么?

时间:2019-06-14 16:15:58

标签: java regex

我想检测一个字符串是否包含如下所示的字符串。

  

ROCK="U3w9kE_ilAuWm3X1gFggmPBnyzE="

ROCK +等号+双引号+一些长度至少为5个字符的非空格字符串+双引号。

我尝试了正则表达式

ROCK=\"[\\S]{5,}\"

当我尝试将ROCK="U3w9kE_ilAuWm3X1gFggmPBnyzE="与该模式匹配时,它不匹配。 \S是非空格字符。 {5,}匹配5个或更多的匹配项。

我想念什么?

确切的模式语法是

String pattern = "ROCK=\"[\\S]{5,}\"";

3 个答案:

答案 0 :(得分:3)

看来您的原始表情还不错:

^ROCK="\S{5,}"$

Demo 1

如果我们希望检测到该表达式,则该表达式可能会起作用:

^(?=ROCK="\S{5,}").*$

Demo 2

测试

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

final String regex = "^(?=ROCK=\"\\S{5,}\").*$";
final String string = "ROCK=\"U3w9kE_ilAuWm3X1gFggmPBnyzE=\"\n"
     + "ROCK=\"U3w45\"\n"
     + "ROCK=\"     \"\n"
     + "ROCK=\"\"\n"
     + "NOTROCK=\"U3w45\"\n"
     + "ROCK=\"U3w4\"";

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

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

捕获组

const regex = /^(?=ROCK="\S{5,}").*$/gm;
const str = `ROCK="U3w9kE_ilAuWm3X1gFggmPBnyzE="
ROCK="U3w45"
ROCK="     "
ROCK=""
NOTROCK="U3w45"
ROCK="U3w4"`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(match);
    });
}

答案 1 :(得分:2)

您应该像ForEach ($S in (Get-ExchangeServer | select -ExpandProperty name)){ $Tracing = Get-MessageTrackingLog -ResultSize Unlimited -server $S -Start $Start -End $End -Sender $Sender | select Timestamp,EventId,Source,Sender,Recipients,MessageSubject,MessageId,OriginalClientIp [string]$TracingString = $Tracing ForEach ($log in $Tracing){ $tracingResults += New-Object -TypeName PSCustomObject -Property @{ Server = $S Timestamp = $log.TimeStamp EventId = $log.EventId Source = $log.Source Sender = $log.Sender Recipients = $log.Recipients MessageSubject = $log.MessageSubject OriginalClientIp = $log.OriginalClientIp MessageId = $log.MessageId } | Select-Object Server,Timestamp,EventId,Source,Sender,Recipients,MessageSubject,MessageId,OriginalClientIp } } } $tracingresults | Export-Csv -NoTypeInformation -Path ./trace.csv 那样使用\S的反斜杠。

另外,您可以尝试使用"ROCK=\"[\\S]{5,}\"",使用带空格族和双引号的否定组(不匹配)".*ROCK=\"[^\\s\"]{5,}\".*",以免被@Mike Samuel指出而被捕获。

这是您可以用于测试的一小节课。将测试字符串添加到[^...]数组中。

tests

快乐的编码

答案 2 :(得分:1)

在Java中,您需要转义\。您在\S中缺少此功能。使用这个:

String regex = "ROCK=\"[\\S]{5,}\"";
boolean matches = "ROCK=\"U3w9kE_ilAuWm3X1gFggmPBnyzE=\"".matches(regex);
System.out.println(matches);

结果将为true