Java 开源 表达式解析 类库

Java有许多开源的表达式解析器。以下是一些常用的选项:

JEXL: JEXL (Java Expression Language) 是一个用于解析和评估表达式的库。它允许你动态地评估复杂的表达式。
GroovyShell: <计算器>
OGNL: OGNL (Object-Graph Navigation Language) 是一个强大的表达式语言,用于在对象图上执行导航、查找和操作。
Jandex: Jandex 是另一个用于解析和评估表达式的库,它特别适用于处理与注解相关的表达式。
MVEL: MVEL (Model-driven Value Expression Language) 是一个动态的表达式语言,用于在运行时解析和评估复杂的表达式。
Apache Commons Lang: Apache Commons Lang 提供了一些用于处理字符串的实用工具,其中也包括表达式解析。

1、使用 JEXL演示:
<dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-jexl3</artifactId>  
    <version>3.1</version>  
</dependency>
import org.apache.commons.jexl3.JexlBuilder;  
import org.apache.commons.jexl3.JexlContext;  
import org.apache.commons.jexl3.JexlException;  
import org.apache.commons.jexl3.JexlExpression;  
import org.apache.commons.jexl3.MapContext;  
  
public static class JexlExample {
        public static void main(String[] args) {
            // 创建 JEXL 表达式  
            String expression = "array.size() > 0 || str.contains(\"苹果\")";
            // 创建 JEXL 上下文(可以传递变量和函数)  
            JexlContext jexlContext = new MapContext();
            jexlContext.set("array", new ArrayList<>());
            jexlContext.set("str", "小苹果");
            // 创建 JEXL 表达式对象  
            JexlExpression jexlExpression = new JexlBuilder()
                    .create()
                    .createExpression(expression);
            // 评估表达式并获取结果  
            Object result = jexlExpression.evaluate(jexlContext);
            // 输出结果  
            System.out.println("Result: " + result); // 输出: Result: 6  
        }
    }

2、使用GroovyShell 演示:

/**
 * groovy 计算器
 * @Date 2022/3/22 11:52
 */
public class Groovy {

    static String EQUATION1 = "(a+b)=(c+d)";
    static String EQUATION2 = "(1+2)=(3+4)";

    public static void main(String[] args) {
        //(1)执行groovy脚本
        GroovyShell groovyShell1 = new GroovyShell();
        groovyShell1.evaluate("println 'hello world'"); // hello world

        //(2)groovy计算器
        Binding binding2 = new Binding();
        binding2.setVariable("a", BigDecimal.valueOf(1000));
        binding2.setVariable("b", BigDecimal.valueOf(1));
        binding2.setVariable("c", BigDecimal.valueOf(2));
        GroovyShell groovyShell2 = new GroovyShell(binding2);
        //计算值
        Object result = groovyShell2.evaluate("(a+b)*c");
        System.out.println("(a+b)*c = " + result); // (a+b)*c = 2002

        //(3)groovy判断等式是否相等
        Binding binding = new Binding();
        //变量前缀: 解决变量是数字会被shell直接解析不会替换值  binding.setVariable("1", "a")  ->  binding.setVariable("p_1", "a");
        String prev =  "p_";
        binding.setVariable(prev + "1", BigDecimal.valueOf(1000));
        binding.setVariable(prev + "2", BigDecimal.valueOf(500));
        binding.setVariable(prev + "3", BigDecimal.valueOf(2000));
        binding.setVariable(prev + "4", BigDecimal.valueOf(2000));

        GroovyShell groovyShell3 = new GroovyShell(binding);

        //结合正则表达式, 替换时添加变量前缀p_
        Map<String, String> prop2Name = Maps.newHashMap();
        prop2Name.put("1", "A");
        prop2Name.put("2", "B");
        prop2Name.put("3", "C");
        prop2Name.put("4", "D");

        String[] split = EQUATION2.split("=");

        //左等式值
        BigDecimal leftValue = (BigDecimal) groovyShell3.evaluate(ReUtil.replaceAll(split[0], "\\d{1,2}", matcher -> prev + matcher.group())); // \d{1,2} 匹配最大十位的整数
        //右等式值
        BigDecimal rightValue = (BigDecimal) groovyShell3.evaluate(ReUtil.replaceAll(split[1], "\\d{1,2}", matcher -> prev + matcher.group()));


        //左等式中文
        String leftName = ReUtil.replaceAll(split[0], "\\d{1,2}", matcher -> prop2Name.get(matcher.group()));
        //右等式中文
        String rightName = ReUtil.replaceAll(split[1], "\\d{1,2}", matcher -> prop2Name.get(matcher.group()));
        
        //等式中文
        String finalEqu = leftName + "=" + rightName;

        //判断等式是否相等
        System.out.println(finalEqu + (leftValue.compareTo(rightValue) == 0 ? " 成立" : "不成立"));
        // (A+B)=(C+D)不成立
    }
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,可以使用 Apache HttpComponents 组件来解析请求头中的 IP 地址。具体方法是使用 HttpComponents 中的 HttpClient 类来获取请求头,再从中获取 IP 地址。代码示例如下: ``` import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; public class Main { public static void main(String[] args) throws IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpGet request = new HttpGet("http://www.example.com"); CloseableHttpResponse response = client.execute(request); String ip = response.getFirstHeader("X-Forwarded-For").getValue(); System.out.println("IP address: " + ip); response.close(); client.close(); } } ``` 这段代码假设请求头中的 IP 地址位于 "X-Forwarded-For" 头部。如果请求头中的 IP 地址位于其他地方,可以调整代码中的 ".getFirstHeader("X-Forwarded-For")" 为相应的请求头部。 ### 回答2: 要解析请求头中的IP地址,可以使用Java开源类库来帮助完成。 在Java中,我们可以使用Servlet API中的HttpServletRequest对象来获取请求信息,包括请求头。可以通过调用HttpServletRequest对象的getHeader方法,传入"X-Forwarded-For"参数,来获取代理服务器传递的客户端IP地址。 然而,并不是所有的代理服务器都会添加"X-Forwarded-For"头部信息。因此,还可以使用Java开源类库解析不同的请求头。 常用的Java开源类库包括: 1. Apache Commons IO:可以使用该类库中的IOUtils类来读取和分析请求头的内容,获取IP地址。 2. Servlets API:Java Servlet规范中提供了HttpServletRequest对象,可以直接用它的getHeader方法来获取请求头信息。 3. Spring Framework:Spring框架提供了很多有用的类和方法,可以帮助我们解析请求头,包括获取IP地址。 这些开源类库都可以通过Maven或Gradle等构建工具导入到项目中,以便使用其中的类和方法。根据具体的需求和项目情况,选择适合的开源类库使用即可。 总的来说,Java开源类库为我们解析请求头中的IP地址提供了方便和灵活的方式。我们可以根据不同的需求和情况,选择合适的类库来使用。 ### 回答3: 要解析请求头中的ip地址,可以使用Java开源类库中的servlet相关类。 首先,需要获取HttpServletRequest对象,它包含了请求头的信息。可以在Servlet中通过参数或者ServletContext获取HttpServletRequest对象。 然后,通过HttpServletRequest对象的getHeader方法获得指定名称的请求头的值。IP地址一般存储在请求头中的"X-Forwarded-For"或者"X-Real-IP"字段中。 可以这样获取IP地址: ```java HttpServletRequest request = ...; // 获取HttpServletRequest对象 String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } ``` 上述代码首先尝试从"X-Forwarded-For"字段获取IP地址,如果获取不到,再尝试从"X-Real-IP"字段获取IP地址,最后从request.getRemoteAddr()获取IP地址。 这样就可以通过Java开源类库解析请求头中的IP地址了。注意,通过上述方式获取的IP地址可能是中间代理服务器的IP地址,而非真正的客户端IP地址,所以需要根据具体的环境和需求进行适配和判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值