例如,我有这样的输入变体:
<p> </p>
或
<p> </p>
或
<p> </p>
我希望检查我的输入,例如:<p>
除
之外的所有数量(0,1或50)...
/[^<p>(\s* \s*)*<\/p>]/ig
似乎有效,但是!
例如我有这样的输入:
<p> t </p>
或
<p> tttt tttt</p>
并且它在想,它等于我的正则表达式......
不是个好主意......
我的正则表达式做错了什么? 或者有更好的方法可以解决这个问题?
答案 0 :(得分:4)
假设您希望消除其中只有Observable.from(Collections.emptyList())
.compose(new Observable.Transformer<List<Object>, List<Object>>() {
@Override
public Observable<List<Object> call(Observable<List<Object>> source) {
boolean isEmpty = observable.isEmpty().toBlocking().first();
if (isEmpty) {
return backupObservable();
} else {
return source;
}
}
});
(或更多)的所有<P>'s
:那么:
假设你有这个
nbsp;
假设黄色部分必须去:因为它里面包含var a='a<p> </p>c<p> </p>d<p> aa </p>e';
:
除了带有纯粹nbsps的有问题的P之外,你将被遗弃:
然后这段代码:
aa
将屈服:
a=a.replace(/(<p>.*?<\/p>)/g, function(match, p1 ) {
if (/^<p>(\s* \s*)*<\/p>$/ig.test(p1))
return '';
else return p1;
})
如您所见 - 由于acd<p> aa </p>e
P
标记未被删除
答案 1 :(得分:1)
你的表达非常接近,你想:
.replace(/<p>(\s* \s*)+<\/p>/ig,'<p> </p>');
这将匹配<p>
后跟\s* \s*
一次或多次后跟</p>
,并将其替换为<p> </p>
。
或者您是否只希望单个
保留完全删除的倍数?在这种情况下,您需要:
.replace(/<p>\s* \s*(\s* \s*)+<\/p>/ig,'')
注意到您不应该使用正则表达式来处理HTML。 ; - )
如果您只需要测试它,请使用:
/<p>(\s* \s*)+<\/p>/.test(string);
一个或多个并且:
/<p>\s* \s*(\s* \s*)+<\/p>/.test(string);
两个或更多。
答案 2 :(得分:0)
您可以在将DOM渲染到页面之前解析DOM中的HTML。这提供了一些好处,因为您不必在正则表达式中包含标记名。另外一个好处是您的段落元素可能包含其他属性,如类名,数据*信息或内联样式;这都将使你的正则表达式测试失败。
因为在添加到正文之前将其解析为DOM,所以第三个好处是您不必在正则表达式中查找
,只需查找空格{{ 1}}(或与任何非空白字符相反)。
\s
然后,您可以使用var strText ='a<p> </p>c<p> </p>d<p> aa </p>e',
$div = $('<div/>').html(strText),
$p = $div.find('p');
var empty_paragraph_count = 0;
$p.each(function(){
var $this = $(this);
if ( /^\s*$/.test( $this.text() ) ){
empty_paragraph_count++;
// uncomment this line if you want to remove the paragraph:
// $this.remove();
}
});
自由地执行任何操作,$div.html();
将显示有多少段落为空或只有空格。
如果您正在寻找VanillaJS解决方案,您可以使用相同的方法:
empty_paragraph_count