我有以下功能:<代码>Pattern#compile和Matcher
,以寻找一种模式的示意图清单。
这一功能用于多个深层。 每个校对将有一个独一无二的模式,在构造时,可采用<条码>。 深层和格局是动态的,这意味着我可以增加<条码>。 配置期间, 模式代码>和校对。
如果使用规章,我是否有必要就这一职能提出<条码>。 j是否安全?
我有以下功能:<代码>Pattern#compile和Matcher
,以寻找一种模式的示意图清单。
这一功能用于多个深层。 每个校对将有一个独一无二的模式,在构造时,可采用<条码>。 深层和格局是动态的,这意味着我可以增加<条码>。 配置期间, 模式代码>和校对。
如果使用规章,我是否有必要就这一职能提出<条码>。 j是否安全?
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html 普通类:
Instances of this (Pattern) class are immutable and are safe for use by multiple concurrent threads. Instances of the Matcher class are not safe for such use.
如果你研究业绩标准代码,则试图利用重新分类方法重开对等地,而不是制造新的事例。 这将重新打造“彩虹”的状态,使“彩虹”的运行成为下游。 事实上,正是国家维持在“马舍尔”案中,它负责在同时准入方面不安全。
Java 定期表达
总结:
The Java regular expression API has been designed to allow a single compiled pattern to be shared across multiple match operations.
You can safely call Pattern.matcher() on the same pattern from different threads and safely use the matchers concurrently. Pattern.matcher() is safe to construct matchers without synchronization. Although the method isn t synchronized, internal to the Pattern class, a volatile variable called compiled is always set after constructing a pattern and read at the start of the call to matcher(). This forces any thread referring to the Pattern to correctly "see" the contents of that object.
On the other hand, you shouldn t share a Matcher between different threads. Or at least, if you ever did, you should use explicit synchronization.
虽然你们需要记住,read切的安全也必须考虑到周围的法典,但你似乎正在uck。 Matchers 创建时使用了以下模式:? 同样,你使用compile 的静态方法制造了 rel=nofollow noreferPatterna>。
因此,简言之,如果你做这样的事:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
你应该做得很好。
守则明晰范例的后续行动:注意到这一例子强烈暗示,由此创建的“匹配”与“模式”和“测试”相适应。 I.e. 您不应向由此而创建的骑师暴露在任何其他深层。
坦率地说,这冒着任何可怕问题的风险。 现实是,如果你尝试得力的话,那么 任何代码就能够变得read-unsafe。 幸运的是,有wonderful books,向我们教授我们能够破坏我们守则的一整套方法。 如果我们远离这些错误,我们就会大大降低我们自己出现问题的可能性。
快速研究<代码>Matcher.java 成员变量nch缩,包括正在配对的案文、集团阵列、维护地点的几个指数,以及另一个州的几个<代码>boolean。 以上所有各点都提到,如果多条<条码><>>>>有条不紊的“Matcher。 http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html
Instances of this class are not safe for use by multiple concurrent threads.
只有在以下情况下,这个问题才会出现:正如@Bob Cross所指出,你无法使用<条码>、, Thread Local
存储物体,以保持
总而言之,你可以重复(在固定变量中加以控制)所汇编的模式,并告诉他们,如果需要的话,可以给你新的匹配者,以验证这些对一些扼杀物的reg。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Validation helpers
*/
public final class Validators {
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,})$";
private static Pattern email_pattern;
static {
email_pattern = Pattern.compile(EMAIL_PATTERN);
}
/**
* Check if e-mail is valid
*/
public static boolean isValidEmail(String email) {
Matcher matcher = email_pattern.matcher(email);
return matcher.matches();
}
}
见http://zoomicon.wordpress.com/ 2009/06/01/validating-e-mails-using-table-expressions-in-java/“rel=“nofollow”http://zoomicon.wordpress.com/2007/06/01/validating-e-mails-using-table-expressions-in-java/。 关于上文用于确认电子邮件的RegEx模式(如果它符合电子邮件确认的需要,则在此张贴)