Чтобы использовать регулярные выражения непосредственно в формулах Excel, может помочь следующая UDF (функция, определенная пользователем).
Он принимает 2-3 параметра.
$0
, $1
, $2
и т. Д. $0
- это полное совпадение, $1
и up соответствуют соответствующим группам совпадений в регулярном выражении. По умолчанию $0
. Извлечение адреса электронной почты:
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")
Результаты в: some@email.com
Извлечение нескольких подстрок:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")
Результаты в: E-Mail: some@email.com, Name: Peter Gordon
Чтобы разделить объединенную строку в одной ячейке на ее компоненты в нескольких ячейках:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)
Результаты в: Peter Gordon
some@email.com
...
Чтобы использовать этот UDF, выполните следующие действия (примерно на основе этой страницы Microsoft . У них есть дополнительная дополнительная информация!):
ALT+F11
, чтобы открыть Редактор Microsoft Visual Basic для приложений . Regex
, а функция regex
вызывает #NAME! ). Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
Dim replaceNumber As Integer
With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
With outputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\$(\d+)"
End With
With outReplaceRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
End With
Set inputMatches = inputRegexObj.Execute(strInput)
If inputMatches.Count = 0 Then
regex = False
Else
Set replaceMatches = outputRegexObj.Execute(outputPattern)
For Each replaceMatch In replaceMatches
replaceNumber = replaceMatch.SubMatches(0)
outReplaceRegexObj.Pattern = "\$" & replaceNumber
If replaceNumber = 0 Then
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
Else
If replaceNumber > inputMatches(0).SubMatches.Count Then
'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
regex = CVErr(xlErrValue)
Exit Function
Else
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
End If
End If
Next
regex = outputPattern
End If
End Function
К счастью, селекторы jQuery позволяют Вам намного больше свободы:
$("div a").click( function(event)
{
var clicked = $(this); // jQuery wrapper for clicked element
// ... click-specific code goes here ...
});
... присоединит указанный обратный вызов к каждому <a>
содержавшийся в <div>
.
Когда событие щелчка jQuery называет Ваш обработчик событий, оно устанавливает "это" на объект, на который нажали. Для превращения его в объект jQuery просто передайте его функции "$": $(this)
. Так, для получения, например, следующего одноуровневого элемента, Вы сделали бы эту внутреннюю часть обработчик щелчков:
var nextSibling = $(this).next();
Редактирование: После чтения комментария Kevin, я понял, что мог бы ошибиться о том, что Вы хотите. Если Вы хотите сделать то, что он спросил, т.е. выберите соответствующую ссылку в другом отделении, Вы могли использовать $(this).index()
для получения положения нажатой ссылки. Тогда Вы выбрали бы ссылку в другом отделении его положением, например, с "eq" методом.
var $clicked = $(this);
var linkIndex = $clicked.index();
$clicked.parent().next().children().eq(linkIndex);
, Если Вы хотите быть в состоянии пойти обоими путями, Вам будет нужен некоторый способ определить, какое отделение Вы находитесь в том, таким образом, Вы знаете, нужно ли Вам "затем ()" или "предыдущий ()" после "родителя ()"
Для выбора одноуровневого элемента Вам было бы нужно что-то как:
$(this).next();
Так, комментарий Shog9 не корректен. В первую очередь, необходимо было бы назвать переменную "нажатой" за пределами функции щелчка отделения, иначе, это потеряно после того, как щелчок происходит.
var clicked;
$("div a").click(function(){
clicked = $(this).next();
// Do what you need to do to the newly defined click here
});
// But you can also access the "clicked" element here
Здесь вы найдете методы siblings () и parent () .
// assuming A1 is clicked
$('div a').click(function(e) {
$(this); // A1
$(this).parent(); // the div containing A1
$(this).siblings(); // A2 and A3
});
Сочетание этих методов с иSelf () позволит вам манипулировать любой комбинацией этих элементов по вашему желанию.
Edit: комментарий, оставленный Марком относительно делегирования событий на ответ Shog9, очень хороший. Самый простой способ сделать это в jQuery - использовать метод live () .
// assuming A1 is clicked
$('div a').live('click', function(e) {
$(this); // A1
$(this).parent(); // the div containing A1
$(this).siblings(); // A2 and A3
});
Я думаю, что он фактически связывает событие с корневым элементом, но эффект тот же. Он не только более гибкий, но и во многих случаях повышает производительность. Обязательно прочтите документацию, чтобы избежать ошибок.