我在Java的setter方法中实现了一个验证,以检查用户是否输入了仅由字母和货币符号组成的字符串值。如果用户想要包含多个值,则单词或符号之间应该有空格。输入是通过扫描仪插入的,我正在尝试下面的正则表达式,但它接受了整行的第一个单词,忽略了其余的单词。在将该行设置为我的私有变量之前,我需要获取该行中的所有单词。
如果除了正则表达式之外还有其他简单的方法,也请注意。
public void set(String countryCurrency) {
if(countryCurrency.matches("^[a-zA-Z\\p{Sc}]*$")) {
this.currency = countryCurrency;
}
}
发布于 2020-09-26 14:14:09
输入是通过扫描仪插入的,我正在尝试下面的正则表达式,但它没有取整行,忽略了剩下的部分。
当您使用Scanner#next
而不是Scanner#nextLine
时,就会发生这种情况。请注意,一旦在输入中遇到空格,Scanner#next
就会停止扫描。
根据您的要求,您还需要更改您的regex,如下所示:
public class Main {
public static void main(String[] args) {
System.out.println("abc $".matches("((\\p{Sc}\\s+)?\\p{Alpha}(\\s+\\p{Sc})?)+"));
System.out.println("$ abc".matches("((\\p{Sc}\\s+)?\\p{Alpha}(\\s+\\p{Sc})?)+"));
}
}
输出:
true
true
正则表达式的解释:
(\\p{Sc}\\s+)?
指定可选(货币符号后跟whitespace).\\p{Alpha}
指定alphabets.(\\s+\\p{Sc})?
指定可选(空格后跟货币符号)。发布于 2020-09-26 19:04:52
使用
.matches("^(?:\\p{Sc}|\\p{L}+)(?:\\s*(?:\\p{Sc}|\\p{L}+))*$")
参见proof。它匹配一个单词或货币符号,然后匹配零个或多个空格字符和货币符号/单词的零个或多个重复项。
https://stackoverflow.com/questions/64078518
复制相似问题