首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在字符串中将否定句替换为正数,反之亦然

在字符串中将否定句替换为正数,反之亦然
EN

Stack Overflow用户
提问于 2015-11-14 06:11:21
回答 1查看 49关注 0票数 1

假设我有一个方程的字符串表示,比如-

(1 -2 3) v (-1 3 2) v (-5 1 4) v (-4 -2 -3) v (-3 4 5) v (1 -2 5) v (3 -2 5) v (2 3 -4) v(2 3-4)v(1-2 5)v(3-2 5)v(2 3-4)

我有一个方法,它接受要修改的字符串、要替换的数值变量以及应该将其设置为

代码语言:javascript
运行
复制
public String changedString(String original, int num, boolean state) {

}

对于一个电话来说

代码语言:javascript
运行
复制
changedString(original, 2, false);

应该返回以下字符串

(13)v (-1 3 -2) v (-5 1 4) v (-4 2 -3) v (-3 4 5) v (1 2 5) v (3 2 5) v (-2 3 -4) v(-2 3-4)v (1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(1 2 5)v(3 2 5)v(-2 3-4)v(-2 3-4)v(-3 4)v(1 2 5)v(3 2 5)v(-2 3-4)v

注意,2(负2s)的所有否定实例都已更改为正实例,而2(正2s)的正实例已更改为负实例。

为了解决这个问题,我最初尝试了显然无法工作的String.replaceAll()。我尝试过的另一种方法是-

代码语言:javascript
运行
复制
public String changedString (String original,int num, boolean state){
        String temp = original;
        if (!state) {
            StringBuilder sb = new StringBuilder(temp);
            //Following code changes negative instances to positives
            String from = "-" + num;
            String to = "" + num;
            int index = sb.indexOf("-" + num);
            while (index != -1) {
                sb.replace(index, index + from.length(), to);
                index += to.length();
                index = sb.indexOf(from, index);
            }

            //Following code changes positive instances to negatives
            from = "" + num;
            to = "-" + num;
            index = sb.indexOf("-" + num);
            while (index != -1) {
                sb.replace(index, index + from.length(), to);
                index += to.length();
                index = sb.indexOf(from, index);
            }
            temp = sb.toString();
        }
        return temp;
    }

然而,这种替代方法的问题是,它总是将任何给定的数字转换为负数。我怎样才能更容易和更有效率地做这件事?

(这是我尝试布尔可满足性问题的一个元素)

EN

回答 1

Stack Overflow用户

发布于 2015-11-14 06:30:35

您可以使用正则表达式,这是String.replaceAll()支持的。问题是,您必须使用一个临时字符来指示哪个数字正在首先切换状态:

代码语言:javascript
运行
复制
public String changedString(String original, int num, boolean state)
{
    String str = original.replaceAll("-" + num + "(?!\\d)", "#" + num);
    str = str.replaceAll("(?<![#0-9])" + num + "(?!\\d)", "-" + num);
    str = str.replaceAll("#" + num + "(?!\\d)", num);
    return str; 
}

这将-num的所有出现替换为#num,然后将num的所有出现替换为-num,然后将#num替换为num。第一步避免了执行-num->num以删除负面的缺陷,然后将所有发生的情况转换为-num

这些正则表达式使用查找来确保数字在不捕获分隔符的情况下被正确地分隔。您可以在这里查看更多内容:http://www.regular-expressions.info/lookaround.html,并在这里查找http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#special语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33705681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档