0

我试图让用户在 10 个字符的范围内为其姓名添加空格。如果他们不想这样做,他们可以选择保留不带空格的名称:myNameLength并且myNoNums匹配得很好。

我不确定如何space在正则表达式中表示 a 。
我使用这个网站来帮助我更多地理解正则表达式以及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));  
        }
4

3 回答 3

1

使用正则表达式验证名称不是一个好主意,但如果你想允许任何字符,包括空格,你可以使用正则表达式:

.{1,10}

但是如果你只想有\w,没有数字但有空格,你可以使用单个正则表达式:

[\\w &&[^\\d]]{1,10}

使用您的代码的当前设置,您确保名称匹配 0 到 10 个空格并且没有其他字符。

于 2013-10-05T16:33:27.520 回答
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声明移动到班级的顶部:private Pattern digit = Pattern.compile("\\d");在顶部。

编辑:意识到我没有回答你的明确问题。我不确定您所说的“有边界的空间”是什么意思。如果要使用正则表达式来检查字符串是否以空格结尾,它是Pattern.compile("\\s+$").matcher(string).find()($ 字符代表输入的结尾);检查字符串是否以空格开头,它是Pattern.compile("^\\s+").matcher(string).find(). 同样,我在实践中将它们分成不同的行;这是为了简洁起见。

您提到的\\t表达式用于明确检查制表符,这似乎不是您想要的;\\s检查任何空白字符。您还可以通过大写来否定这些特殊的正则表达式字符;string.matches("\\S+")将告诉您字符串是否完全由非空白字符组成。

此外,您的测试断言将在带有空格的名称上失败,因为您正在调用s.matches(myNameLength),它会检查整个字符串是否包含 1 到 10 个单词字符;“单词字符”定义为 [a-zA-Z0-9_]。测试字符串中的任何空格,matches()并将返回false.

于 2013-10-05T18:32:22.010 回答
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")。

于 2013-10-05T20:20:51.087 回答