假设a Regular Expression,通过Java Matcher对象与大量字符串匹配:
String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched
Matcher matcher; // Declare but not initialize a Matcher
for (String input:ALL_INPUT)
{
matcher = pattern.matcher(input); // Create a new Matcher
if (matcher.matches()) // Or whatever other matcher check
{
// Whatever processing
}
}
Run Code Online (Sandbox Code Playgroud)
在Java SE 6 JavaDoc for Matcher中,可以Matcher通过该reset(CharSequence)方法找到重用同一对象的选项,正如源代码所示,该方法比Matcher每次创建新对象要便宜一些,即,与上面不同,可以做: …
根据SimpleDateFormat类文档,Java它的日期模式不支持超过毫秒的时间粒度.
所以,日期字符串就像
通过模式解析时
实际上将.符号后面的整数解释为(接近10亿!)毫秒,而不是纳秒,导致日期
即超过11天.令人惊讶的是,使用较少数量的S符号仍会导致所有9位数被解析(而不是,例如,最左边的3位.SSS).
有两种方法可以正确处理此问题:
是否有任何其他方法可以通过向标准SimpleDateFormat实现提供模式来获得正确的解决方案,而无需任何其他代码修改或字符串操作?
IntelliJ IDEA 13已开始在我的本地设置中展示一种非常奇怪的行为.
也就是说,在Java添加到现有项目的任何新类中,Code Completion都不起作用.因此,在新类中声明任何类型的对象变量,然后键入该变量的名称,然后输入点(.)之后,不会对相应对象的任何方法提出建议.
例如,在声明之后
File f = new File("/home");
Run Code Online (Sandbox Code Playgroud)
键入f.不会显示File类中所有方法的列表,从中选择一个.事实上,当键入点(.)时,没有任何建议出现在IDE窗口的左下角(在状态栏中),消息"标识符预期.标识符预期".被展示.有时候,提出了一系列来自不相关组件或库的完全不相关的方法.
奇怪的是,Code Completion如果上述声明发生在任何现有类中,则按预期工作.
在机器重新启动,IDE重新启动,项目重新导入,关闭/重新打开或重建的许多组合之后,此行为仍然存在.
有任何想法吗?
我需要解析连续的格式良好的XML元素流,我只给它一个已构造的java.io.Reader对象.这些元素不包含在根元素中,也不是像XML标题一样<?xml version="1.0"?>",而是有效的XML.
使用Java org.xml.sax.XMLReader类不起作用,因为XML Reader期望从封闭的根元素开始解析格式良好的XML.因此,它只读取流中的第一个元素,它将其视为根,并在下一个元素中失败,典型的
org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确.
对于不包含根元素的文件,但是这样的元素确实存在或者可以定义(并且被称为MyRootElement),可以执行以下操作:
Strint path = <the full path to the file>;
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
StringBuilder buffer = new StringBuilder();
buffer.append("<?xml version=\"1.0\"?>\n");
buffer.append("<!DOCTYPE MyRootElement ");
buffer.append("[<!ENTITY data SYSTEM \"file:///");
buffer.append(path);
buffer.append("\">]>\n");
buffer.append("<MyRootElement xmlns:...>\n");
buffer.append("&data;\n");
buffer.append("</MyRootElement>\n");
InputSource source = new InputSource(new StringReader(buffer.toString()));
xmlReader.parse(source);
Run Code Online (Sandbox Code Playgroud)
我已经通过将部分java.io.Reader输出保存到文件来测试上述内容并且它可以工作.但是,这种方法在我的情况下不适用,并且无法插入此类额外信息(XML标头,根元素),因为java.io.Reader已经构造了传递给我的代码的对象.
基本上,我正在寻找"碎片式XML解析".所以,我的问题是,可以使用标准Java API(包括org.sax.xml.*和java.xml.*包)来完成吗?
是否有任何Java开源库支持CSV的多字符(即长度> 1的字符串)分隔符(分隔符)?
根据定义,CSV =逗号分隔值数据,单个字符(',')作为分隔符.但是,存在许多其他单字符替代方案(例如,制表符),使CSV代表"字符分隔值"数据(本质上,DSV:分隔符分隔值数据).
用于CSV的主要Java开源库(例如,OpenCSV)几乎支持任何字符作为分隔符,但不支持字符串(多字符)分隔符.所以,对于用"|||"这样的字符串分隔的数据 除了预处理输入以便将字符串转换为单字符分隔符之外别无选择.从那时起,数据可以解析为单字符分隔值.
因此,如果有一个本地支持字符串分隔符的库,那将是很好的,因此不需要预处理.这意味着CSV现在标记为"CharSequence-Separated Values"数据.:-)
如果CSV被重新定义为"字符分隔值",即使用任何单个字符(但通常是任何非字母数字符号)作为分隔符而不仅仅是逗号的数据,那么自动检测文件实际上是CSV的可靠方法是什么??
本质上,使用此(重新)定义,CSV = DSV("分隔符 - 分隔值"),例如,在本维基百科文章中讨论,而"逗号分隔值"格式在RFC 4180中定义.
更具体地说,是否存在一种统计推断数据具有某种"固定"长度的方法,意味着"可能的CSV"?仅计算分隔符的数量并不总是有效,因为每个记录都有可变数量字段的 CSV文件(即,与RFC 4180要求相反的记录,在同一文件中没有相同数量的字段).
CSV识别似乎是一个特别具有挑战性的问题,特别是如果检测不能基于文件扩展名(例如,当读取无论如何都没有这种信息的流时).
正确("完整")自动检测需要至少4个可靠的决策:
由于其他数据集(例如,使用逗号的自由文本)的相似性,完全自动检测似乎没有单一的解决方案,特别是对于诸如可变长度记录,单引号或双引号字段或多行记录的转角情况.
因此,最佳方法似乎是望远镜检测,其中在应用CSV检测规则之前检查也可以归类为CSV的格式(例如,像Apache CLF这样的日志文件格式).
甚至像Excel这样的商业应用程序似乎依赖于文件扩展名(.csv)来决定(1),这显然不是自动检测,尽管如果应用程序被告知数据是CSV,问题会大大简化.
以下是一些讨论(2)和(3)的启发式的好相关文章:
(4)(引号的类型)的检测可以基于处理来自文件的几行并查找相应的值(例如,每行的偶数'或'将表示单引号或双引号).可以通过初始化现有的CSV解析器(例如,OpenCSV)来完成,该解析器将适当地关注CSV行分离(例如,多行事件).
但是(1),即首先确定数据是CSV呢?
莫非数据挖掘这一决定帮助吗?
我想构建一个简单的正则表达式,涵盖引用的字符串,包括其中的任何转义引号.例如,
"This is valid"
"This is \" also \" valid"
Run Code Online (Sandbox Code Playgroud)
显然,像
"([^"]*)"
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它匹配第一个转义引用.
什么是正确的版本?
我想其他转义字符的答案是相同的(只需替换相应的字符).
顺便说一句,我知道"全能"正则表达式
"(.*?)"
Run Code Online (Sandbox Code Playgroud)
但我尽量避免使用它,因为毫不奇怪,它比一个更具体的运行速度慢一些.
实现类似方法的最快和更强大(就唯一性而言)的方法是什么
public abstract String hash(String[] values);
Run Code Online (Sandbox Code Playgroud)
该values[]阵列具有100到1,000个成员,每个成员具有几十个字符,并且该方法每次需要在不同的values[]阵列上运行大约10,000次/秒.
是应该使用StringBuilder缓冲区构建长字符串,然后在缓冲区内容上调用哈希方法,还是继续为每个字符串调用哈希方法values[]?
显然,需要至少64位的散列(例如,MD5)来避免冲突,但是在相同的质量下,是否有更简单,更快的方法可以做到?
例如,怎么样
public String hash(String[] values)
{
long result = 0;
for (String v:values)
{
result += v.hashCode();
}
return String.valueOf(result);
}
Run Code Online (Sandbox Code Playgroud) 我有一个来自库的大型JAR文件,其源代码分散在多个不同的文件夹中,因此我必须手动合并这些文件夹并指定单个合并文件夹作为源.
Eclipse中有没有办法将多个源文件夹链接到特定的JAR?我猜不是,我试过的各种技巧似乎不起作用,但如果有人知道一个有效,请发布.
Java 7 SimpleDateFormat通过字符X(而不是大写或小写Z)在ISO 8601格式的类中引入了支持.在Java 6中支持这样的格式需要预处理,因此最好的方法是问题.
这种新格式是Z(大写Z)的超集,另外还有两种变体:
因此,正如人们可以从Java 7文档中SimpleDateFormat看到的那样,以下3种格式现在是有效的(而不仅仅是ZJava 6中涵盖的第二种格式),当然,等效:
正如之前关于支持这种"扩展"时区格式的特殊情况的问题所讨论的那样,始终使用':'作为分隔符,将Java 7功能向后移植到Java 6中的最佳方法是将类子SimpleDateformat类化并覆盖其parse()方法,即:
public Date parse(String date, ParsePosition pos)
{
String iso = ... // Replace the X with a Z timezone string, using a regex
if (iso.length() == date.length())
{
return null; // Not an ISO 8601 date
}
Date parsed …Run Code Online (Sandbox Code Playgroud)