Java 创建仅包含特定字符的字符串[]
我正在尝试创建一个Java 创建仅包含特定字符的字符串[],java,regex,Java,Regex,我正在尝试创建一个字符串[],它只包含由某些字符组成的单词。例如,我有一本字典,里面有许多这样的单词: 手臂 军队 艺术 作为 在 攻击 尝试 注意 吸引力 权威 自动的 唤醒 宝贝 返回 坏的 纸袋 平衡 我想缩小列表的范围,使其只包含字符a、b和g的单词。因此,在本例中,列表应仅包含单词“bag”。 目前,我正在尝试使用正则表达式来实现这一点,但之前从未使用过它们,所以我似乎无法让它正常工作。 这是我的密码: public class LetterJugglingMain { public
字符串[]
,它只包含由某些字符组成的单词。例如,我有一本字典,里面有许多这样的单词:
手臂
军队
艺术
作为
在
攻击
尝试
注意
吸引力
权威
自动的
唤醒
宝贝
返回
坏的
纸袋
平衡
我想缩小列表的范围,使其只包含字符a
、b
和g
的单词。因此,在本例中,列表应仅包含单词“bag”。
目前,我正在尝试使用正则表达式来实现这一点,但之前从未使用过它们,所以我似乎无法让它正常工作。
这是我的密码:
public class LetterJugglingMain {
public static void main(String[] args) {
String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt";
fileReader fr = new fileReader();
fr.openFile(dictFile);
String[] dictionary = fr.fileToArray();
String regx = "able";
String[] newDict = createListOfValidWords(dictionary, regx);
printArray(newDict);
}
public static String[] createListOfValidWords(String[] d, String regex){
List<String> narrowed = new ArrayList<String>();
for(int i = 0; i<d.length; i++){
if(d[i].matches(regex)){
narrowed.add(d[i]);
System.out.println("added " + d[i]);
}
}
String[] narrowArray = narrowed.toArray(new String[0]);
return narrowArray;
}
公共类LetterJugglingMain{
公共静态void main(字符串[]args){
String dictFile=“/Users/simonrhillary/Desktop/Dictionary(3.txt)”;
fileReader fr=新的fileReader();
fr.openFile(dictFile);
String[]dictionary=fr.fileToArray();
字符串regx=“able”;
String[]newDict=CreateListofValidWord(字典,regx);
打印阵列(newDict);
}
公共静态字符串[]CreateListofValidWord(字符串[]d,字符串正则表达式){
缩小列表=新建ArrayList();
对于(int i=0;i正则表达式able
将只匹配字符串“able”
。但是,如果希望正则表达式匹配a
、b
、l
或e
,则您要查找的正则表达式是[able]
(括号中)。如果您想要包含多个此类字符的单词,请添加一个+
以重复模式:[able]+
正则表达式able
将仅与字符串“able”匹配
。但是,如果希望正则表达式与a
、b
、l
或e
中的任一字符相匹配,则要查找的正则表达式是[able]
(括号中)。如果希望单词包含多个此类字符,请添加一个+
以重复模式:[able]+
OP需要包含每个字符的单词,而不仅仅是其中一个。
其他角色也不是问题
如果是这种情况,我认为最相似的方法是逐个字符循环整个字符串,并检查它是否包含您想要的所有字符。保留标志以检查是否找到了每个字符
如果情况并非如此
尝试使用正则表达式:
^[able]+$
它的作用如下:
^
匹配字符串的开头,$
匹配字符串的结尾。这确保您没有获得部分匹配
[able]
匹配您希望字符串包含的字符,在本例中,a
,b
,l
,e
+
确保字符串中有一个或多个字符
注意:此正则表达式将匹配包含这4个字母的字符串。例如,它将匹配:
艾比,艾比,艾比,艾比
而且不会匹配
可治疗的,可治疗的
OP需要包含每个字符的单词,而不仅仅是其中一个。
其他角色也不是问题
如果是这种情况,我认为最相似的方法是逐个字符循环整个字符串,并检查它是否包含您想要的所有字符。保留标志以检查是否找到了每个字符
如果情况并非如此
尝试使用正则表达式:
^[able]+$
它的作用如下:
^
匹配字符串的开头,$
匹配字符串的结尾。这确保您没有获得部分匹配
[able]
匹配您希望字符串包含的字符,在本例中,a
,b
,l
,e
+
确保字符串中有一个或多个字符
注意:此正则表达式将匹配包含这4个字母的字符串。例如,它将匹配:
艾比,艾比,艾比,艾比
而且不会匹配
qable,treatable,and abled.一个示例正则表达式,用于筛选出集合中至少包含所有字符中一个匹配项的单词。这将匹配至少包含所有字符A、b、g中一个匹配项的任何英文单词(不区分大小写):
(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+
匹配的字符串示例为bag
,baggy
,grab
不匹配的字符串示例有大
,参数
,无
(?i)
表示打开不区分大小写的标志
您需要为每个字符添加与集合中字符数相同的(?=.*)
我假设一个单词只包含英文字母,所以我指定[a-z]
。如果需要空格、连字符等,请指定更多
我假设匹配String
类中的(String regex)
方法,因此我省略了^
和$
性能可能很差,因为在最坏的情况下(字符位于单词末尾)我认为正则表达式引擎可以在N倍的情况下通过字符串,其中N是集合中字符的数量。它可能不是真正的关注点,因为单词很短,但是如果它是一个瓶颈,你可以考虑做简单的循环。 < P>一个至少包含至少包含单词的样本正则表达式。集合中所有字符的一次出现。这将匹配至少包含一次出现的所有字符a、b、g的任何英文单词(不区分大小写):
(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+
匹配的字符串示例为bag
,baggy
,grab
不匹配的字符串示例有大
,参数
,无
(?i)
表示打开案例插入