我有一个包含数千个条目(网格节点)的文本文件,如
7.40000000000060391E+01 7.40000866410523770E+00
1.05000000970718801E+01 6.40000007900613273E+01
2.40500000000000321E+02 2.40000000428227065E+00
6.00000000000000000E+00 3.70000085530326430E+01
7.40000019596598406E+01 6.40000000000000000E+01
3.10000144967919340E+01 1.92000112854581857E+01
6.40000000000000000E+01 6.40004500000000000E+01
我的某些条目有一个小错误,我想删除。我正在使用textpad。我想保留第一个数字,直到我找到一个三重零并将所有其他十进制数字设置为零。上面的例子如下:
7.40000000000000000E+01 7.40000000000000000E+00
1.05000000000000000E+01 6.40000000000000000E+01
2.40500000000000000E+02 2.40000000000000000E+00
6.00000000000000000E+00 3.70000000000000000E+01
7.40000000000000000E+01 6.40000000000000000E+01
3.10000000000000000E+01 1.92000000000000000E+01
6.40000000000000000E+01 6.40000000000000000E+01
有什么建议吗? 谢谢 阿尔贝托
答案 0 :(得分:1)
如果您附近没有JGSoft或.NET引擎,可以尝试使用regexhero.net。 这是一个online regular expression tester powered by .NET!
你可以:
NOTA:我与regexhero没有任何关系:)
答案 1 :(得分:1)
有趣的问题。这可以使用正则表达式和使用回调函数替换值的String.replace()
方法在JavaScript中轻松解决。首先需要制作一个正则表达式,它匹配那些在尾数中连续三个零位后具有非零数字的高精度浮点数。这是一个用python自由间隔模式编写的正则表达式,带有注释:
re_truncatablebleFloat = re.compile(r"""
# Match real/float number having form: 1.23450009012345678E+12
\b # Anchor to word boundary.
( # $1: Part to be preserved.
\d+\. # Integer portion and dot.
[1-9]* # Zero or more non-zero decimal digits.
(?: # Zero or more significant zeros.
0 # Allow a zero digit, but only
(?!00) # if not start of a triple 000.
[1-9]* # Zero or more non-zero decimal digits.
)* # Zero or more significant zeros.
000+ # Three or more zeros mark end of first part.
) # End $1: Part to be preserved.
([1-9]\d*) # $2: Mantissa digits to be zeroed out.
([Ee][+-]\d+) # $3: Well formed exponent.
\b # Anchor to word boundary.
""", re.VERBOSE)
请注意,此正则表达式仅匹配需要修改的浮点数。它捕获捕获组$1
中数字的初始部分,要在组$2
中归零的数字,最后捕获组$3
中的指数。
以下是经过测试的JavaScript函数,该函数利用上述正则表达式和回调函数来解决手头的问题:
function processText(text) {
var re = /\b(\d+\.[1-9]*(?:0(?!00)[1-9]*)*000+)([1-9]\d*)([Ee][+-]\d+)\b/g;
return text.replace(re,
function(m0, m1, m2, m3){
m2 = m2.replace(/[1-9]/g, '0');
return m1 + m2 + m3;
});
}
以下是包含上述JavaScript功能的独立网页
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>Process Text 20140217_1300</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
body {margin: 2em; color:#333; background:#DDB;}
h1, p {font-family: monospace; text-align: center;}
textarea {width: 99%;}
</style>
<script type="text/javascript">/* <![CDATA[ */
// Process the input text.
function processText(text) {
var re = /\b(\d+\.[1-9]*(?:0(?!00)[1-9]*)*000+)([1-9]\d*)([Ee][+-]\d+)\b/g;
return text.replace(re,
function(m0, m1, m2, m3){
m2 = m2.replace(/[1-9]/g, '0');
return m1 + m2 + m3;
});
}
/* Read input, process, then write to output */
function handleOnclick() {
var el_in = document.getElementById('inbox'),
el_out = document.getElementById('outbox');
el_out.value = processText(el_in.value);
return false;
} /* ]]> */</script>
</head><body>
<h1>Process Text</h1>
<form action="" method="get">
<h2>Input:</h2>
<p>
<textarea id="inbox" name="inbox" rows="10" cols="80"></textarea>
<input type="button" id="process" name="process" value="Process"
onclick="return handleOnclick();"/>
</p>
<h2>Output:</h2>
<p>
<textarea id="outbox" name="outbox" rows="10" cols="80"></textarea>
Note: Line endings may not be preserved! (i.e.
LF may be changed to CRLF or vice-verse)
</p>
</form>
</body></html>
只需将其保存为桌面上的HTML文件,然后使用您喜欢的浏览器打开它。它不需要外部资源,可以轻松修改/重新使用以解决类似问题。
快乐的复兴!