正则表达式在$$符号

时间:2018-04-30 09:23:35

标签: java regex

我希望正则表达式只在$$符号之间找到一个单词。它必须以$符号开头和结尾。我试过下面的表达

final String regex = "\\$\\w+\\$";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher("$abc$ cde$efg$hij pqr");

这应该给我数为1.但是我的正则表达式也考虑了第二次出现(cde $ efg $ hij)它不应该考虑因为它不是以$$开头和结尾。

2 个答案:

答案 0 :(得分:2)

您可以使用非字边界:

final String regex = "\\B\\$\\w+\\$\\B"; 

如果$abc$之前没有单词字符,则该模式将匹配。请参阅regex demo

请参阅Java demo

String regex = "\\B\\$\\w+\\$\\B";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("$abc$ cde$efg$hij pqr");
while (matcher.find()){
    System.out.println(matcher.group(0)); 
} // => $abc$

除了非字边界外,如果你只想在空白字符或字符串的开头/结尾之间进行匹配,你可以使用空白边界

String regex = "(?<!\\S)\\$\\w+\\$(?!\\S)";

或者,使用明确的单词边界(我称之为):

String regex = "(?<!\\w)\\$\\w+\\$(?!\\w)";

如果在当前位置的左侧立即找到单词char,则(?<!\\w)负向后看将使匹配失败,如果立即找到单词char,则(?!\w)否定前瞻将使匹配失败在当前位置的右侧。

答案 1 :(得分:1)

问题是为我提取美元符号之间的字段。

priceEth.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ArrayList<String> newar = new ArrayList<>();
                    newar = ethPrice;
                    //Collections.sort(ethPrice);
                    LineGraphSeries<DataPoint> ser = new LineGraphSeries<>(dats());
                    ethPrice = newar;
                    graph.addSeries(ser);

                }
            });

 private DataPoint[] dats() {
            int n = ethPrice.size();
            DataPoint[] values = new DataPoint[n];

            for(int i = 0; i<n;i++){

                DataPoint v = new DataPoint(Double.parseDouble(ethPrice.get(i)), i);
                values[i]=v;
            }
            return values;
}

这将返回美元符号之间的单词列表。