我有以下代码:
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*"
会产生同样的影响。
答案 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点)。