2012-03-04 159 views
1

可能重复:
JAVA: check a string if there is a special character in it的Java:检查字符串结尾或特殊字符开头

我试图创建一个方法来检查密码的开头或结尾一个特殊的角色。还有一些其他的检查,我已经设法编码,但这似乎有点复杂。

我想我需要使用正则表达式来有效地做到这一点。我已经创建了一个方法来检查是否有任何特殊字符,但我无法弄清楚如何修改它。

Pattern p = Pattern.compile("\\p{Punct}"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character!"); 

按照书我读我需要使用^和$的图案来检查,如果它开始或特殊字符结束。我可以只添加两个语句到现有的模式,或者我应该如何开始解决这个问题?

编辑:

好吧,我想我得到了非正则表达式的方法工作:

for (int i = 0; i < password.length(); i++) { 
    if (SPECIAL_CHARACTERS.indexOf(password.charAt(i)) > 0) 
    specialCharSum++; 
} 
+1

http://stackoverflow.com/questions/1795402/java-check-a-string-if-there-is-a-special-character-in-it – 2012-03-04 18:34:13

回答

4

最简单的方法将是一个或分组。

Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character at the beginning or end!"); 
+0

虽然我可能会试图让这个更少如果(!passowrd.matches(...))[当然对正则表达式进行了适当的修改],则可以通过写作而啰嗦。 – 2012-03-04 18:43:45

+0

好的 - 我对dichrit的代码进行了最小修改。我也考虑过沿着Adam Mihalcin的charAt方法,但是海报似乎也明白这个代码,为什么要改变它呢? – 2012-03-04 20:49:53

3

使用此图案:

"^\\p{Punct}|\\p{Punct}$" 
  • ^\\p{Punct} = “串的开始,后跟一个标点符号字符
  • | = ”或“
  • \\p{Punct}$ =” 标点字符,后面跟以字符串结尾“
5

难道你不能只使用charAt来获得角色和indexOf来检查角色是否是特殊的?

final String SPECIAL_CHARACTERS = "?#"; // And others 

if (SPECIAL_CHARACTERS.indexOf(password.charAt(0)) >= 0 
     || SPECIAL_CHARACTERS.indexOf(password.charAt(password.length() - 1)) >= 0) { 
    System.out.println("password begins or ends with a special character"); 
} 

我没有异形(分析对性能的金科玉律),但我希望通过编译时字符串常量迭代比的正则表达式生成并执行一个有限状态自动机更快。此外,Java的正则表达式比FSA更复杂,所以我期望Java正则表达式的实现方式不同,因此比FSA更慢。

+2

这几乎就是我现在在编辑框中键入的内容,但是你更快。我分享你对(ab)使用正则表达式这样简单的例子的想法。 – Barend 2012-03-04 18:37:48

+0

你当然可以。这取决于您是否喜欢正则表达式的简洁性,或者如果您不熟悉正则表达式,则更喜欢使用更详细的代码来交换更明确的内容。如果您知道自己在做什么,则正则表达式可能会将各种检查压缩为一个简洁的代码行。所以这实际上是一个偏好问题 - 哪些代码对您而言更容易理解? – 2012-03-04 18:39:24

+0

@NeilCoffey无论您是否使用正则表达式,都应该将这样的检查打包到方法中。在其他代码中,检查同样是冗长的,因为这是一种单一的方法调用。在这个方法里面,其含义是明确的。 – 2012-03-04 18:43:04

相关问题