我一直想要提高我的正则表达技能已经有一段时间了,而且"掌握正则表达式"被推荐了很多次,所以我买了它并且在过去一天左右阅读它.
我创建了以下正则表达式:
^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$
Run Code Online (Sandbox Code Playgroud)
哪个匹配前两个链接但忽略<i>标记所包含的两个链接.它提取id,标题和类型.
<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>
<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>
Run Code Online (Sandbox Code Playgroud)
虽然它有效,但对于这么简单的东西来说似乎相当长,可以改进吗?
除了执行以下操作之外,是否有更简单的方法从匹配中仅抓取一个元素:
my $date = ($xml_file =~ m/(\d+)-sys_char/)[0];
# or
my $date = $1 if $xml_file =~ /(\d+)-sys_char/;
Run Code Online (Sandbox Code Playgroud)
是否有一个标志来指定m不返回数组但只是一个$#匹配的连接值,所以我可以这样做:?
my $date = ($xml_file =~ mSOMEOPT/(\d+)-sys_char/);
Run Code Online (Sandbox Code Playgroud)
从最后删除0?
可能重复:
Java中的相似性字符串比较
大家好
我试图使用Java找到两个字符串之间的部分匹配,当然,stackoverflow上有很多问题和答案,但是,这些都不符合我的要求.我有两个字符串(句子),例如,"强大的java编程"和"强大的编程技巧".现在我想测量这两个句子之间的相似程度,如25%,而不仅仅是部分匹配 = ture或false.
谢谢
我已经用几种不同的方法对它进行了测试.我比较的字符串s与日志文件中显示的字符串完全相同.撇号是为了确保没有空格.有谁知道发生了什么?
import java.lang.reflect.Method;
import android.util.Log;
public class Button {
public Button () {
for(Method m1:MyOtherClass.class.getMethods()) {
String s = m1.getName();
if(s == "Update") {
Log.i("result","true");
}
Log.i("test", "'" + s + "'");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个列表中的函数,如果其中一个元素为负数,那么该列表中与其正对应元素相等的任何元素都应该更改为0.例如,如果有一个-2在列表中,该列表中的所有2都应更改为0.
任何想法为什么它只适用于某些情况而不适用于其他情况?我不明白为什么会这样,我已经好几次看过了.
changeToZero [] = []
changeToZero [x] = [x]
changeToZero (x:zs:y:ws) | (x < 0) && ((-1)*(x) == y) = x : zs : 0 : changeToZero ws
changeToZero (x:xs) = x : changeToZero xs
Run Code Online (Sandbox Code Playgroud)
*Main> changeToZero [-1,1,-2,2,-3,3]
[-1,1,-2,2,-3,3]
*主要> changeToZero [-2,1,2,3]
[-2,1,0,3]
*主要> changeToZero [-2,1,2,3,2]
[-2,1,0,3,2]
*Main> changeToZero [1,-2,2,2,1]
[1,-2,2,0,1]
我的项目是基于android的草药识别.我使用ORB来获取关键点,功能和匹配功能.
我想用这个算法:
{
for (j=MinID; j<=MaxID; j++){
MatOfDMatch matches = DetectUtility.match(features, matFromJson(DB.GetORBFitur(j)));
List<DMatch> matchesList = matches.toList();
Double max_dist = 0.0;
Double min_dist = 100.0;
for (int i = 0; i < matchesList.size(); i++){
Double dist = (double) matchesList.get(i).distance;
if (dist < min_dist && dist != 0){
min_dist = dist;
}
if (dist > max_dist){
max_dist = dist;
}
}
Run Code Online (Sandbox Code Playgroud)
从这个网站,我得到这个代码:
//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< …Run Code Online (Sandbox Code Playgroud) 我有如下数据结构.
[{"league"=>:nba, "period"=>"h1","edge"=>-5.0, "home_team"=>"Cavaliers"},
{"league"=>:nba, "period"=>"h1", "edge"=>-6.0, "home_team"=>"Pistons"},
{"league"=>:nba, "period"=>"h1", "edge"=>-6.0, "home_team"=>"Bucks"},
{"league"=>:ncaab, "period"=>"h1", "edge"=>-7.0, "home_team"=>"Wisconsin"},
{"league"=>:ncaab, "period"=>"h1", "edge"=>-7.0, "home_team"=>"Wisconsin"}]
Run Code Online (Sandbox Code Playgroud)
我需要为数组中的每个元素分配一个新的键/值对,key = "id",value = x,其中x是一个整数.本x应是每一个元素,它同样"period"和"home_team"值是相同的,否则什么x是无所谓.所以上面应该会产生这样的结果:
[{"league"=>:nba, "period"=>"h1","edge"=>-5.0, "home_team"=>"Cavaliers", "id"=>1},
{"league"=>:nba, "period"=>"h1", "edge"=>-6.0, "home_team"=>"Pistons", "id"=>2},
{"league"=>:nba, "period"=>"h1", "edge"=>-6.0, "home_team"=>"Bucks", "id"=>3},
{"league"=>:ncaab, "period"=>"h1", "edge"=>-7.0, "home_team"=>"Wisconsin", "id"=>4},
{"league"=>:ncaab, "period"=>"h1", "edge"=>-7.0, "home_team"=>"Wisconsin", "id"=>4}]
Run Code Online (Sandbox Code Playgroud) 我有两个相同数量的元素列表,例如:[1,2,3]和['a','b','c'].
我想以格式合并它们[(1,'a')(2,'b')(3,'c')].可能吗?如果是这样,怎么办?我找不到办法.
我有一个这样的字符串:
Free-coffee and coffee-free is free coffee
Run Code Online (Sandbox Code Playgroud)
我只需要匹配和替换单独的单词free而不是单词{Free}-coffee和coffee-{free}
想法是在字符串中标记坏词并添加这样的HTML标签<strong>:
Free-coffee and coffee-free is <strong>free<strong> coffee.
Run Code Online (Sandbox Code Playgroud)
我尝试使用空格,但如果在这句话之前有空格,有时会失败。
这是我当前的正则表达式:
/(\sfree\s|\sfree|free\s)/ig
Run Code Online (Sandbox Code Playgroud)
注意:这需要不区分大小写。
这是代码示例:
var text = "Free-coffee and coffee-free is free coffee";
text = text.replace(/(\sfree\s|\sfree|free\s)/ig, " <strong>strong</strong> ");
Run Code Online (Sandbox Code Playgroud)
请帮帮我。
编辑:好的,我很抱歉,因为我对问题的第一个措辞过于简单,技术上正确的答案不适用于我的案例,所以这次我会尽量详细。
我正在构建一个正则表达式来捕获单个或复合代码。每个代码都以“H”、“G”、“EUH”或“AUG”开头,后跟三位数字 (H123) 或三位数字、一个点和一位数字。(H123.1)。第一个数字不能是零。
每个 H 代码后面可以跟一个或多个以下字符:“idDfF”.(H231Df)。每个 P 代码后面可以跟一个或多个这些字符:“AEBDab”。(P333a)。每个 EUH 代码后面都可以跟“A”。(EUH123A)。
化合物示例:H123Df+H234+H234.1+H342.1Fd 和 P123.1+P555D 空格可以在字符串中的任何位置,除了 3 位数字,它们总是相互跟随,没有空格。点或破折号可以在末尾的额外字符之前(H123-Df、H123.Df)
我需要匹配每个化合物或单个代码。请注意,在我之前的尝试中,我检测到 H567+H890+H654 正确,但也检测到 H567、H890 和 H654,这是错误的。一旦匹配了一个集合,它的内部代码不应再被视为单个代码。
我目前的方法实际上是 4 个不同的正则表达式代码,每组代码一个。它主要有效(我猜),但它非常乏味,如果将另一个代码添加到化合物中将无法工作,并且在正则表达式中添加更复杂的东西时,它非常难以维护。这是 P 代码的正则表达式示例。
`p = "P\s*\d{3}[.\s-]*[AEBDab]*\s*[+/]\s*P*\s*\d{3}[.\s-]*[AEBDab]*\s*[+/]\s*P*\s*\d{3}[.\s-]*[AEBDab]*|P\s*\d{3}[.\s-]*[AEBDab]*\s*[+/]\s*P*\s*\d{3}[.\s-][AEBDab]*|P\s*\d{3}[.\s-]*[AEBDab]*\s`"
Run Code Online (Sandbox Code Playgroud)
如您所见,它非常长且效率低下,编辑一个小东西会花费很多时间并且很容易出错。
我怎样才能以更好的方式实现这一目标?是制作 4 个正则表达式更好还是仅一个用于捕获所有 4 个代码的所有格式?
编辑:现实版本看起来完全像这样:
text = "random text
H326random text H243Df+H546+H677-Drandom text
randomtext P234a+P333.Ddrandom text
someother randomtexts"
output = [H326, H243+H546+H677, H234+H333]
Run Code Online (Sandbox Code Playgroud)
注意:所提供的文本中的空格非常随机,因为它们是用 pdfminer 库解析的 PDF 文本,它非常混乱了顺序和空格,但它是我发现的唯一一个可以实际“读取”我所有 10k PDF 文件的库有,其他库会产生空字符串,或者只是读取 PDF 的一部分。
注意:如果您能解释一下您的答案,因为在我工作时,我总是在发现新格式,并且我希望能够根据需要编辑正则表达式。
谢谢!