我想检测一个字符串是否包含如下所示的字符串。
ROCK="U3w9kE_ilAuWm3X1gFggmPBnyzE="
ROCK
+等号+双引号+一些长度至少为5个字符的非空格字符串+双引号。
我尝试了正则表达式
ROCK=\"[\\S]{5,}\"
当我尝试将ROCK="U3w9kE_ilAuWm3X1gFggmPBnyzE="
与该模式匹配时,它不匹配。 \S
是非空格字符。 {5,}
匹配5个或更多的匹配项。
我想念什么?
确切的模式语法是
String pattern = "ROCK=\"[\\S]{5,}\"";
答案 0 :(得分:3)
看来您的原始表情还不错:
^ROCK="\S{5,}"$
如果我们希望检测到该表达式,则该表达式可能会起作用:
^(?=ROCK="\S{5,}").*$
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
。