我想要匹配短语import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
public class example extends JPanel {
private String[] columnNames = { "Volume"
};
private Object[][] data = { {new Integer(5)},
{new Integer(1)},
{new Integer(2)},
{new Integer(3)},
{new Integer(5)},
{new Integer(5)},
{new Integer(7)} };
private DefaultTableModel myModel = new DefaultTableModel(data, columnNames);
private JTable table = new JTable(myModel);
private JScrollPane scrollPane = new JScrollPane(table);
private TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(myModel);
private JButton button;
private JButton button2;
private JTextField filterText;
RowFilter<DefaultTableModel, Integer> GreaterThan = new RowFilter<DefaultTableModel, Integer>() {
public boolean include(Entry<? extends DefaultTableModel, ? extends Integer> entry) {
myModel = entry.getModel();
//0 is the first column
if ((int) table.getValueAt(entry.getIdentifier(), 0) > Integer.parseInt(filterText.getText())) {
return true;
}
return false;
}
};
RowFilter<DefaultTableModel, Integer> LessThan = new RowFilter<DefaultTableModel, Integer>() {
public boolean include(Entry<? extends DefaultTableModel, ? extends Integer> entry) {
myModel = entry.getModel();
//0 is the first column
if ((int) table.getValueAt(entry.getIdentifier(), 0) < Integer.parseInt(filterText.getText())) {
return true;
}
return false;
}
};
public example() {
filterText = new JTextField();
button = new JButton("Click to sort Greater Than");
button2 = new JButton("Click to sort Less Than");
add(button);
add(button2);
add(scrollPane);
table.setRowSorter(sorter);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sorter.setRowFilter(GreaterThan);
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sorter.setRowFilter(LessThan);
}
});
}
}
中短语Sortes\index[persons]{Sortes}
的存在。
使用python test Sortes\index[persons]{Sortes} text
我可以这样做:
re
这样做有效,但我想避免搜索模式>>> search = re.escape('Sortes\index[persons]{Sortes}')
>>> match = 'test Sortes\index[persons]{Sortes} text'
>>> re.search(search, match)
<_sre.SRE_Match object; span=(5, 34), match='Sortes\\index[persons]{Sortes}'>
对短语Sortes
给出肯定的结果。
test Sortes\index[persons]{Sortes} text
所以我使用>>> re.search(re.escape('Sortes'), match)
<_sre.SRE_Match object; span=(5, 11), match='Sortes'>
模式,如下所示:
\b
现在,我没有得到匹配。
如果搜索模式不包含任何字符search = r'\b' + re.escape('Sortes\index[persons]{Sortes}') + r'\b'
match = 'test Sortes\index[persons]{Sortes} text'
re.search(search, match)
,则可以使用。 E.g:
[]{}
此外,如果我删除最终的>>> re.search(r'\b' + re.escape('Sortes\index') + r'\b', 'test Sortes\index test')
<_sre.SRE_Match object; span=(5, 17), match='Sortes\\index'>
,它也可以:
r'\b'
此外,documentation说的是re.search(r'\b' + re.escape('Sortes\index[persons]{Sortes}'), 'test Sortes\index[persons]{Sortes} test')
<_sre.SRE_Match object; span=(5, 34), match='Sortes\\index[persons]{Sortes}'>
注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者在\ w和字符串的开头/结尾之间。
所以我尝试用\b
替换最终的\b
:
(\W|$)
瞧,它有效! 这里发生了什么?我错过了什么?
答案 0 :(得分:3)
查看单词边界匹配的内容:
字边界可以出现在以下三个位置之一:
- 在字符串中的第一个字符之前,如果第一个字符是单词字符。
- 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
- 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
在您的模式中}\b
仅匹配}
后面的单词char(字母,数字或_
)。
当您使用(\W|$)
时,您需要明确字符串的非单词或结尾。
在这些情况下,我总是建议基于负面外观的明确的单词边界:
re.search(r'(?<!\w){}(?!\w)'.format(re.escape('Sortes\index[persons]{Sortes}')), 'test Sortes\index[persons]{Sortes} test')
此处,如果当前位置左侧有一个单词char,则(?<!\w)
负反馈将使匹配失败,如果立即有单词char,则(?!\w)
否定前瞻将使匹配失败在当前位置的右侧。
实际上,可以更容易地进一步自定义这些外观模式(例如,如果模式周围有字母,则只能使匹配失败,请使用[^\W\d_]
代替\w
,或者如果您只允许在空格周围进行匹配,请使用(?<!\S)
/ (?!\S)
环视边界)。
答案 1 :(得分:0)
我认为这是你遇到的:
\b
落在\w
和\W
的边界上,但是在不起作用的示例中。 '{Sortes}\b'
是\W
和\W
之间的边界,因为'}'
与[a-zA-Z0-9_]
不匹配,\w
的普通集合}。