【问题标题】:How to find specific character in Java如何在Java中查找特定字符
【发布时间】:2012-02-04 11:55:44
【问题描述】:

我在 java 中有一个类似 a>5 and b<6 or c>=7 的字符串

当我检查字符串是否包含 > 时,>>= 的输出都为真

我怎样才能将我的支票限制在特定的字符上?

如何使用matches函数?

【问题讨论】:

    标签: java string substring contains


    【解决方案1】:

    您的错误是,您将词汇实体>= 视为“字符”。这将不止一次地咬你,因为实际上有两个字符,>=,而> 确实在这里。因此,根据您的需要,答案可能会有所不同。

    您为什么不想看到>= 找到了?

    您对> 的什么用法感兴趣?将例如<tag>some text</tag> 是您希望允许的正确字符串吗?

    【讨论】:

    • @alf 我的兴趣是我的输入字符串将是查询,我想区分包含 > 和 >=.. 的条件。我知道 >= 包含 > 这就是为什么 CONTAINS 函数给出 true..所以这就是我要问的如何解决它......?
    • @SRK “查询”是什么意思?如果查询恰好有a < 5 and s == "<br/>",那么> 是否算作您需要的查询?为了解决一个问题,你需要define一个问题。到目前为止,它根本没有定义。
    • @alf 是的,你是对的......
      不应被视为大于。我尝试了 CONTAINS 和 REPLACE ,但仍然找不到解决方案。
    • @SRK 请参阅stackoverflow.com/questions/278480/antlr-tutorials 以获得更多帮助:)
    【解决方案2】:

    您想区分大于大于或等于。为什么不写一个返回操作符的方法呢?

    enum Operator { 
    ...
    }
    
    public Operator getOperator(String s) { 
    
        if(s.contains(">=")) { 
           return Operator.GREATER_THAN_OR_EQUAL_TO;
        } else if (s.contains(">") {
           return Operator.GREATER_THAN;
        }
    
    }
    

    如果输入可以是包含多个运算符的复杂表达式,而不是 contains,请尝试使用 indexOf(...) 并向前看一个字符作为“=”。

    【讨论】:

    • 它仍然会在<tag>hi there!</tag> 上失败——也就是说,不会失败,但不会给出错误的“正确”答案:)
    • 是的,他并没有真正谈论数据。如果是标签数据,他对当前的实现感到厌烦。
    • @AmirAfghani 我认为如果 S 同时包含 >= 和 >,这不会给出正确答案
    • 能详细点吗?
    • @SRK 您的规范在这一点上并不具体。由于您尚未定义如果字符串同时包含>=> 会发生什么,这意味着我们可以在不违反规范的情况下做任何事情。您必须先修复规范,然后再进行其他任何操作。
    【解决方案3】:

    我只是根据更新后的规范把它放在一起。基本上是一个真正简单的解析器,相当机械地创建:(而且我早上 7 点不擅长命名哦)

    public class Main {
    
        public static void main(String[] args) {
            String test = "a > b >= c > x";
            Main m = new Main(test);
            System.out.println(m.getTokenNumber());
    
            test = "aasdfasdf asdfdasf";
            m = new Main(test);
            System.out.println(m.getTokenNumber());
        }
    
        private String input;
        private int pos;
    
        public Main(String input) {
            this.input = input;
            pos = 0;
        }
    
        public TokenNumber getTokenNumber() {
            TokenNumber tokenNumber = new TokenNumber();
            Token t = nextToken();
            while (t != Token.NONE) {
                tokenNumber.addToken(t);
                t = nextToken();
            }
            return tokenNumber;
        }
    
        private Token nextToken() {
            while (pos < input.length() && input.charAt(pos) != '>') pos++;
            if (pos == input.length()) return Token.NONE;
            pos++;
            if (pos == input.length() || input.charAt(pos) != '=') return Token.GREATER;
            return Token.GREATER_EQUAL;
        }
    
        enum Token {
            GREATER, GREATER_EQUAL, NONE;
        }
    
        static class TokenNumber {
            public int greater;
            public int greater_than;
    
            public void addToken(Token t) {
                if (t == Token.GREATER) greater++;
                else greater_than++;
                assert t != Token.NONE;
            }
    
            public String toString() {
                return String.format("Greater: %d%nGreater Than: %d", greater, greater_than);
            }
        }
    
    }
    

    【讨论】:

    • 这确实是极好的代码,但假设我有@alf a > 5 和 s == "
      " 建议的字符串,那么您的代码也在计算 > 的 br 。但我只需要计算 > 5 中的 > 即只有 > 真正表示 > 处于状态的符号,而不是 > 用于关闭标签的符号..
    • @SRK 解决方案几乎保持不变,您只需添加对其他令牌的支持。基本上,你需要为你的代码创建一个词法分析器,一旦你得到了标记流,你就可以检查是否有标记&gt;。字符串由允许 string-literal 标记的语法规则处理。不幸的是,这将是一篇很好的文章来解释这个主题——或者一本书,所以试着从stackoverflow.com/questions/278480/antlr-tutorials开始——那里有很好的教程。
    【解决方案4】:
    "your string >".contains(">");// returns true
    

    【讨论】:

      【解决方案5】:

      boolean value = Pattern.compile("&gt;").matcher("a&gt;5").find(); // returns true

      【讨论】:

      • 您提供的模式匹配过于具体而无用。
      猜你喜欢
      • 2021-12-22
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多