将简单Ruby正则表达式转换为Java

将简单Ruby正则表达式转换为Java,java,ruby,regex,Java,Ruby,Regex,在与Ruby中断了几年之后,我将返回Java。我正在寻找实现以下Ruby语句的惯用且简短的Java代码: some_string.scan(/[\w|\']+/) 上面的表达式从字符串创建数组。数组中的元素是由字母数字字符(\w)或撇号(\')组成的某些字符串的所有部分,因此“John”不会被拆分为两个单词。) 例如: “(农夫的女儿)去了市场”。扫描(/[\w| \']+/) => [“那个”、“农民的”、“女儿”和……] 更新 我知道解决方案将使用以下内容: String[]单词=句子。拆

在与Ruby中断了几年之后,我将返回Java。我正在寻找实现以下Ruby语句的惯用且简短的Java代码:

some_string.scan(/[\w|\']+/)
上面的表达式从字符串创建数组。数组中的元素是由字母数字字符(
\w
)或撇号(
\'
)组成的
某些字符串的所有部分,因此“John”不会被拆分为两个单词。)

例如:

“(农夫的女儿)去了市场”。扫描(/[\w| \']+/)

=>

[“那个”、“农民的”、“女儿”和……]

更新 我知道解决方案将使用以下内容:

String[]单词=句子。拆分(“”)


我只需要
split()

正则表达式中的regex部分,即使跨语言,其行为也应该大致相同。在这种情况下,唯一的区别是您必须转义反斜杠和单引号

如果用Ruby编写
/[\w']+/
,用Java编写
Pattern.compile(“[\\w\']+”)


哦,也是


这不是完全相同的事情,但是为什么不使用空格上的字符串呢?空格是单词的边界

"The farmer's daughter went to the market".split("\s");

正则表达式的行为应该或多或少相同,即使在不同的语言中也是如此。在这种情况下,唯一的区别是您必须转义反斜杠和单引号

如果用Ruby编写
/[\w']+/
,用Java编写
Pattern.compile(“[\\w\']+”)


哦,也是


这不是完全相同的事情,但是为什么不使用空格上的字符串呢?空格是单词的边界

"The farmer's daughter went to the market".split("\s");
怎么样

String[] words = test.split("[^a-zA-Z0-9']+");

这些模式与Ruby示例的不同之处在于,您使用的是Ruby的String#scan,即提供与单词匹配的模式。Java的String#split与Ruby的同名方法类似——您提供与单词分隔符匹配的模式。

如何

String[] words = test.split("[^a-zA-Z0-9']+");


这些模式与Ruby示例的不同之处在于,您使用的是Ruby的String#scan,即提供与单词匹配的模式。Java的String#split与Ruby的同名方法类似——您提供与单词分隔符匹配的模式。

Java没有内置的
scan
方法可以在函数调用中执行此操作,因此您需要自己滚动循环。使用Java的regex
Matcher
类可以很容易地做到这一点

import java.util.regex.*;

String yourString = "(The farmer's daughter) went to the supermarket";

/* The regex syntax is basically identical to Ruby, except that you need
 * to specify your regex as a normal string literal, and therefore you need to 
 * double up on your backslashes. The other differences between my regex and 
 * yours are all things that I think you need to change about the Ruby version
 * as well. */
Pattern p = Pattern.compile("[\\w']+");
Matcher m = p.matcher(yourString);
List<String> words = new Vector<String>();
while (m.find()) {
   words.add(m.group());
}
import java.util.regex.*;
String yourString=“(农夫的女儿)去了超市”;
/*regex语法基本上与Ruby相同,只是需要
*将正则表达式指定为普通字符串文字,因此需要
*把你的后睫毛加倍。我的正则表达式和
*我认为你需要改变Ruby版本的所有东西
*还有*/
模式p=模式.compile(“[\\w']+”);
Matcher m=p.Matcher(您的字符串);
列出单词=新向量();
while(m.find()){
添加(m.group());
}

我不确定在这种情况下使用
Matcher
与使用
Scanner
的相对优点是什么

Java没有内置的
scan
方法可以在函数调用中实现这一点,因此您需要自己滚动循环。使用Java的regex
Matcher
类可以很容易地做到这一点

import java.util.regex.*;

String yourString = "(The farmer's daughter) went to the supermarket";

/* The regex syntax is basically identical to Ruby, except that you need
 * to specify your regex as a normal string literal, and therefore you need to 
 * double up on your backslashes. The other differences between my regex and 
 * yours are all things that I think you need to change about the Ruby version
 * as well. */
Pattern p = Pattern.compile("[\\w']+");
Matcher m = p.matcher(yourString);
List<String> words = new Vector<String>();
while (m.find()) {
   words.add(m.group());
}
import java.util.regex.*;
String yourString=“(农夫的女儿)去了超市”;
/*regex语法基本上与Ruby相同,只是需要
*将正则表达式指定为普通字符串文字,因此需要
*把你的后睫毛加倍。我的正则表达式和
*我认为你需要改变Ruby版本的所有东西
*还有*/
模式p=模式.compile(“[\\w']+”);
Matcher m=p.Matcher(您的字符串);
列出单词=新向量();
while(m.find()){
添加(m.group());
}

我不确定在这种情况下使用
Matcher
与使用
Scanner
的相对优点是什么

我知道java和java中的正则表达式,但我看不出Ruby正则表达式在做什么。你能用语言说出来吗?:)字符类中不需要
|
(用括号括起来
[]
),也不需要转义
。正则表达式
/[\w']+/
是正确的,而你的是错误的。我知道java中的java和正则表达式,但我看不出你的Ruby正则表达式在做什么。你能用语言说出来吗?:)字符类中不需要
|
(用括号括起来
[]
),也不需要转义
。正则表达式
/[\w']+/
是正确的,而您的是错误的。这非常接近。我知道我需要使用.split,我只需要正则表达式过滤掉除撇号以外的非字母字符。@bevanb,我刚刚学会了使用
字符串
s。看看它是否能解决你的问题。另外,方括号内的
是不必要的。Ruby中的正则表达式应该是
/[\w']+/
,Java中的等效正则表达式是
“[\\w']+”
@MatheusMoreira,感谢您指出
是不必要的。这非常接近。我知道我需要使用.split,我只需要正则表达式过滤掉除撇号以外的非字母字符。@bevanb,我刚刚学会了使用
字符串
s。看看它是否能解决你的问题。此外,方括号内的
是不必要的。Ruby中的正则表达式应该是
/[\w']+/
,Java中的等效正则表达式是
“[\\w']+”
@MatheusMoreira,感谢您指出
是不必要的。