正则表达式不适用于Android,但在Java

时间:2015-12-12 02:08:26

标签: java android regex

我有以下代码:

String compact =  Pattern.compile(" *(\\{) *| *(\\}) *").matcher(" { { } } ")
                     .replaceAll("$1$2");

在Java中,compact包含{{}} - 这就是我想要的 - 但在Android上,我得到的{null{nullnull}null}让我发疯。难道我做错了什么?

以下行在Android上产生相同的结果:

String compact =  " { { } } ".replaceAll(" *(\\{) *| *(\\}) *", "$1$2")

对于想要玩它的人来说,这是一个online Java version

如果有帮助,我会在Android Studio的Mac上使用jdk1.7.0_79编译Android SDK 23。

更新:使用"\\s*(\\{)\\s*|\\s*(\\})\\s*"会产生同样的影响。

1 个答案:

答案 0 :(得分:0)

我不能告诉你为什么它在Java中表现得像那样,但我可以告诉你为什么它在Android中表现得像那样。我可以提供一些关于Java的线索。

当您命令Matcher#replaceAll(String)时,该类会检查是否有find(),如果确实有String,它会将输入中匹配的内容替换为替换Matcher#appendEvaluated(StringBuffer, String)你提供了。

到目前为止一切顺利。

但是,当替换实际上是组的表示时,将采用另一种方式。该类尝试查找与该组相对应的内容(请参阅append(String))和StringBuffer内部使用的内部group(int)

通过显式调用方法null来实现。此方法在Java和Android 中的行为是,如果匹配时没有与给定组相对应的那个,它将返回group(int)注意:当根本没有匹配时它会抛出异常,而不仅仅是当找不到与该组相对应的异常时抛出异常。例如,find()没有StringBuffer

最后,当您附加String对象时,null会输出“null”replaceAll(字面意思为“null”)。所以,对于你要求的每个小组,当有匹配时,它会在其上附加单词“null”。

Java中使用的算法完全不同,在replaceAll的情况下具有不同的输出。

没有测试太多或修复效率低下(对不起,只是在12月3日上午3点浏览并不能帮助我直接思考),我认为你可以在Android中实现与使用你所得到的相同的结果在Java中使用,而不是String input = " { { } } "; Matcher matcher = Pattern.compile(" *(\\{) *| *(\\}) *").matcher(input); while (matcher.find()) { String a = matcher.group(1); // $1 String b = matcher.group(2); // $2 String replacement = null; if (a != null && b != null) { replacement = a + b; } else if (a != null) { replacement = a; } else if (b != null) { replacement = b; } if (replacement != null) { input = input.replace(matcher.group(), replacement); } }

add_shortcode( 'multiple_enquiry_form', 'enquiry_form' );
function enquiry_form(){
    if ( is_user_logged_in() ) { 
        if(isset($_POST['enquiry_form_submit'])){   
    } ?>    

    <div class="col-md-4">
        <form method="post" name="enquiry_form" action='<?php echo get_permalink( get_page_by_path( 'enquiry' ) ); ?>'> 
            <div class="form-group">
            <label for="">Project</label>
            <select id='proGroup' name="proGroupForm">
            <option value="">- Select Project -</option>                
            </select>
            </div>
            <div class="form-group">
            <label for="">Message</label>
            <textarea name="enq_message"></textarea>

            </div>
            <div class="form-group">
            <label for="">Contact</label>   
            <input type="text" name="contactNumber" placeholder="Contact Number"> 
            </div>
            <div class="form-group">
            <label for="">From</label>  
            <input type="text" name="from_date" class="datepicker" placeholder="From Date"> 
            </div>
            <div class="form-group">
            <label for="">To</label>    
            <input type="text" name="to_date" class="datepicker" placeholder="To Date"> 
            </div>
            <div class="form-group">
            <input type="submit" name="enquiry_form_submit" value="Send" ng-click="submitted=true">
            </div>
        </form>
    </div>
    <?php }
}

如果没有,请告诉我。我只进行了一些原油测试(毕竟凌晨3点)。