我试图让用户在10个字符的边界内为其名称添加空格。如果他们不想,他们可以选择保留名称不含空格:myNameLength
和myNoNums
完全匹配。
我不确定如何在正则表达式中表示space
我已经使用this website来帮助我理解正则表达式以及JPS,但我无法找到正确的语法。
到目前为止,我已经尝试了下面的内容以及\\t{0,10}","[ ]{0,10}
和[\\s]*
。另外我知道它不是\t
或\s
,因为Java使用正则表达式的方式不同。
这就是我想知道的原因:
Java是否有不同的方式来编写带边界的空间?
@Test
public void testName()
{
String myNameLength = "\\w{1,10}";
String myNoNums = "[^\\d]{1,10}";
String mySpaces = "\\s{0,10}";
Player p = new Player();
p.Player("Antonio");
String s = p.getName();
assertTrue(s.matches(myNameLength) && s.matches(myNoNums) && s.matches(mySpaces));
}
答案 0 :(得分:1)
使用正则表达式验证名称不是一个好主意,但如果您想允许任何字符,包含空格,您可以使用正则表达式:
.{1,10}
但是如果你想只有\w
,没有数字但有空格,你可以使用单一的正则表达式:
[\\w &&[^\\d]]{1,10}
使用当前的代码设置,您确保该名称可以匹配0到10个空格而不包含其他字符。
答案 1 :(得分:0)
我对你的要求有点模糊,但是通过阅读你的问题,看起来你唯一要做的就是排除数字并限制长度,所以你不必担心明确检查用于空间;
之类的东西public boolean isValid(String name) {
if (name==null) {
return false;
}
int len = name.length();
Pattern digit = Pattern.compile("\\d");
return len>0 && len<=10 && !digit.matcher(name).find();
}
如果你真的想使用正则表达式,应该可以工作。当然,如果你选择这条路线,我还建议将正则表达式存储为Pattern
只为你的类编译一次 - 将digit
声明移到类的顶部:{{1 }} 在顶部。
编辑:已实现我没有回答您的明确问题。我不确定你的意思是“有边界的空间”。如果你想使用正则表达式来检查一个字符串是否以空格结束,它是private Pattern digit = Pattern.compile("\\d");
($字符代表输入的结尾);检查字符串是否以空格开始,它是Pattern.compile("\\s+$").matcher(string).find()
。再一次,我在实践中将它们分成不同的部分;这是为了简洁起见。
您提到的Pattern.compile("^\\s+").matcher(string).find()
表达式用于明确检查制表符,这似乎不是您想要的; \\t
检查任何空格字符。你也可以通过大写它们来否定这些特殊的正则表达式字符; \\s
将告诉您字符串是否完全由非空白字符组成。
此外,您的测试断言将在包含空格的名称上失败,因为您正在调用string.matches("\\S+")
,它会检查整个字符串是否包含1到10个字符; “单词字符”定义为[a-zA-Z0-9_]。测试字符串中的任何空格和s.matches(myNameLength)
都将返回matches()
。
答案 2 :(得分:0)
你的意思是你想要允许最多十个字母,以及不计入长度的可选空格吗?你可能正在寻找这个:
"^(?:[a-z] *){1,9}[a-z]$" // spaces allowed within the name, but not at the ends
......或者这个:
"^(?: *[a-z]){1,10} *$" // spaces allowed everywhere
在编译正则表达式时,请确保并指定CASE_INSENSITIVE
模式。
至于匹配正则表达式中的空格字符,没有技巧;你就像我一样使用文字空间。但它确实看起来有点尴尬,它不会在COMMENTS
模式下工作。您还可以使用十六进制转义符("\\x20"
)或Unicode转义符("\\u0020"
)。